二叉树遍历

Posted Seven_noon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树遍历相关的知识,希望对你有一定的参考价值。

二叉树遍历最简单的就是递归了。因为递归实质上是栈存了一些中间值,所以我们可以使用stack实现迭代版的遍历。

  • 中序遍历

步骤:

首先将root节点作为当前节点。

1.如果当前节点不为空,压入当前节点。将左节点作为当前节点。

2.否则弹出栈顶节点作为当前节点,输出当前节点。

3.如果右节点不为空,右节点作为当前节点。

4.否则将当前节点置为空。

重复1、2、3、4直到栈为空。

void InorderTraversal(TreeNode *root){
    if(!root)return;
    TreeNode *node=root;
    stack<TreeNode*> mystk;
    while(node||mystk.size()){
        while(node){
            mystk.push(node);
            node=node->left;
        }   
        node=mystk.top();
        mystk.pop();
        cout<<node->val<<\t;
        if(node->right){
            node=node->right;
        }else{
            node=NULL;
        }   
   }   
}
  • 前序遍历

前序遍历和中序遍历差不多,只是输出节点值的时机不同。

步骤:

以root节点作为当前节点

1.如果当前节点不为空,将当前节点压入栈,同时输出当前节点。并将左节点作为当前节点。

2.否则弹出栈顶作为当前节点。

3.如果右节点不为空,将右节点作为当前节点。

4.否则将当前节点置为空。

重复1、2、3、4直到栈为空。

void PreorderTraversal(TreeNode *root){

    if(!root)return;
    TreeNode *node=root;
    stack<TreeNode*> mystk;
    while(node||mystk.size()){
        while(node){
            mystk.push(node);
            cout<<node->val<<\t;
            node=node->left;
        }
        node=mystk.top();
        mystk.pop();
        if(node->right){
            node=node->right;
        }else{
            node=NULL;
        }
   }
}
  • 后序遍历

后序遍历有点特殊,需要一个辅助节点记录是否遍历过了。

步骤:

将root节点作为当前节点

1.如果当前节点不为空,将当前节点压入栈中。将左节点作为当前节点。

2.否则,将栈顶节点(不弹出)作为当前节点。

3.如果右节点不为空且右节点不等于pre节点,将右节点作为当前节点。

4.否则,输出当前节点,pop栈顶,并将当前节点作为pre节点。设置当前节点为空。

重复1、2、3、4直到栈为空。

void PostorderTraversal(TreeNode *root){
    if(!root)return;
    TreeNode *node=root;
    TreeNode *pre=NULL;
    stack<TreeNode*> mystk;
    while(node||mystk.size()){
        while(node){
            mystk.push(node);
            node=node->left;
        }
        node=mystk.top();
        if(node->right&&node->right!=pre){
            node=node->right;
        }else{
            cout<<node->val<<\t;
            mystk.pop();
            pre=node;
            node=NULL;
        }
   }
}

 

 

上述三种遍历对于每个节点都是入栈一次出栈一次,所以时间复杂度和空间复杂度都是o(n)。

而Morris遍历则可以o(1)完成各种遍历。下面解释morris遍历。

  • Morris遍历

morris遍历的精髓是提出了前驱节点的概念:即输出前驱节点后,下一个输出的就是当前节点。

参考http://blog.csdn.net/zhaoyunfullmetal/article/details/48087663

 

以上是关于二叉树遍历的主要内容,如果未能解决你的问题,请参考以下文章

编程实现以上二叉树中序遍历操作,输出遍历序列,求写代码~~

c++二叉树按层序遍历顺序输入(由上到下),先序遍历顺序输出,求完整代码

代码随想录--二叉树

二叉树的非递归遍历怎么写?

二叉树遍历和延伸

二叉树的遍历