菜菜题解 | #实现二叉树先序,中序和后序遍历#

实现二叉树先序,中序和后序遍历

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)
      }
      };
全部评论

相关推荐

点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务