美文网首页
二叉树遍历

二叉树遍历

作者: 我要吃面包 | 来源:发表于2017-05-11 21:16 被阅读0次

二叉树遍历可以分为广度遍历和深度遍历,深度遍历又可以分为前序遍历、后序遍历、中序遍历。
对于一个二叉树,如下图:



广度遍历:a,b,c,d,f,e,g
前序遍历:a,b,d,e,f,g,c
后序遍历:e,d,g,f,b,c,a
中序遍历:d,e,b,g,f,a,c

常用的遍历有递归和非递归版本,拿广度遍历来说:
  • 递归版本:
class TreePrinter {
public:
    vector<vector<int> > printTree(TreeNode* root) {
        vector<vector<int> >res;
        if(root == NULL) return res;
        printTree(res,root,0);
        return res;
    }
    void printTree(vector<vector<int>>&res,TreeNode* root,int total)//这里使用total来记录存放在那一层
    {
        if(root == NULL) return;
        if(res.size()==total)
            res.push_back(vector<int>());
        res[total].push_back(root->val);
        printTree(res,root->left,total+1);
        printTree(res,root->right,total+1);
    }
};

二叉树的广度优先遍历和先序遍历有几分相似,所不同的是广度优先遍历使用一个total来记录当前二叉树节点属于那一层。

  • 非递归版本:
class TreePrinter {
public:
   vector<vector<int> > printTree(TreeNode* root) {
       // write code here
       vector<vector<int>> result;
       result.resize(500);
       queue<TreeNode*> q;
       int last, nlast, layer=0;
       q.push(root);
       last = root->val;
       while(!q.empty())
       {
          TreeNode* t = q.front();
           result[layer].push_back(t->val);
           if(t->left) q.push(t->left);
           if(t->right) q.push(t->right);
           if(t->val == last) layer++, last = q.back()->val;
           q.pop();
       }
       result.resize(layer);
       return result;
   }
};

非递归版本都需要借助一个队列或者栈,将其左右孩子放入栈,自己出栈。

      同样的道理,你可以实现一下二叉树的先序遍历、后续遍历、和中序遍历。
      对于二叉树的算法,常用的就是递归方法,所以大家要熟练掌握递归,如果你还不了解递归,建议你从斐波拉契数列开始看起~

相关文章

  • 二叉树 基础操作

    二叉树的使用 二叉树结构 先序创建二叉树 DFS 先序遍历二叉树 中序遍历二叉树 后序遍历二叉树 BFS 层次遍历...

  • 关于二叉树的算法题

    前序遍历中序遍历后序遍历判断是否是平衡二叉树判断是否是对称二叉树判断二叉树高度按照层遍历二叉树判断二叉树宽度

  • 二叉树遍历

    二叉树 二叉树的存储结构 前序遍历 中序遍历 后序遍历 遍历代码 反转二叉树 深入学习二叉树 二叉树-你必须要懂!...

  • 二叉树操作

    树节点 逐行顺序解析二叉树 前序遍历二叉树 中序遍历二叉树 后序遍历二叉树 删除指定数值的节点 前序遍历顺序存储的...

  • 数据结构与算法之二叉树遍历(七)

    目录 前序遍历中序遍历后序遍历层序遍历遍历方式的选择条件根据遍历结果重构二叉树翻转二叉树计算二叉树的高度判断一棵树...

  • 二叉树三种遍历Swift代码实现

    二叉树的三种遍历 二叉树 前序遍历 中序遍历 后序遍历 另外 不得不说,得到二叉树的前序遍历和中序遍历的结果或者后...

  • 二叉树的遍历

    二叉树的遍历 二叉树遍历 分为前序遍历、中序遍历和后序遍历。 前序遍历 (DLR) 先访问根节点,然后前序遍历左子...

  • 前端二叉树

    (一)构造二叉树 (二)中序遍历 (三)前序遍历 前序遍历可以复制二叉树,效率比重新构造二叉树高 (四)后序遍历 ...

  • 数据结构:树的实现和遍历(c++)

    (一)二叉树的遍历——递归实现 二叉树常见的遍历方式分为前序遍历、中序遍历和后序遍历。 1 前序遍历 前序遍历也叫...

  • leetcode 144 145 94

    二叉树遍历 前序遍历 中序遍历 后序遍历

网友评论

      本文标题:二叉树遍历

      本文链接:https://www.haomeiwen.com/subject/wyyotxtx.html