菜菜题解 | #实现二叉树先序,中序和后序遍历#
实现二叉树先序,中序和后序遍历
http://www.nowcoder.com/practice/a9fec6c46a684ad5a3abd4e365a9d362
从纯新手视角解读的菜菜题解
知识点:前中后序遍历,说白了就是 root 左 root 右 root,这样关系,root在左右的前中后位置,懂了这个就能很好的写递归,然后在三个位置插入代码。
先说一下我犯的错误,1.在传入result接口时刚打的时候没有加&,这个大学依照我的理解,是需要修改里面数据时,就要变成引用,前面的TreeNode*是指针就是要改变指向位置。小白时期对这两个东西很难搞懂,什么引用就不能修改,也不能指向空的什么的,
ps:值传递和引用传递的区别:1、值传递方法调用时,实际参数把它的值传递给对应的形式参数;2、引用传递方法调用时,实际参数是对象或数组,这时实际参数与形式参数指向同一个地址。
个人对实参和形参理解,读了effective c++后,认为形参就是接口那边占位置的参数,告诉人们是一个什么类型的对象将会在这传入,主要传达一个形式,实参就是(真实参与运算)的对象。
2.我打的时候,没有在result后面加(3),这时内存栈就爆了,因为我用了隐晦的语言分配内存,我觉得是这样。
/**
- struct TreeNode {
- int val;
- struct TreeNode *left;
- struct TreeNode *right;
- };
- /
这个是一个树的结构,一个int 值,两个TreeNode指针,代表左右子树结点。
//外层是定义一个class,名叫solution,他的public成员函数,public意味着is-a,这点也是在effective c++反复强调的。
class Solution {
public:
/*- @param root TreeNode类 the root of binary tree
- @return int整型vector<vector<>>
- /
void travel(TreeNode* root, vector<vector<int>> &result){//函数名叫travel,叫啥其实都可,返回void,不需要返回,接口:指针 引用容器 if(root){//先判空 result[0].push_back(root->val);//前序,root进入容器在递归左子树前。 travel(root->left, result); result[1].push_back(root->val);//中序,root进入容器在递归左子树和右子树之间 travel(root->right, result); result[2].push_back(root->val);//后序,root进入容器在递归右子树之后 } }
//底下主函数vector<vector<int> > threeOrders(TreeNode* root) {//接口,传入指针*root // write code here vector<vector<int>> result(3);//我们需要的三个容器 travel(root,result);//递归求解三个前中后序遍历 return result;//结果是三个变长数组(vector)的变长数组(vector)
}
};