二叉树遍历算法总结

原创 2016年06月01日 20:55:05

二叉树遍历算法


前中后序遍历的教科书式写法

    //非递归前序遍历
    void preorderTraversal(TreeNode *root, vector<int> &path)
    {
        stack<TreeNode *> s;
        TreeNode *p = root;
        while(p != NULL || !s.empty())
        {
            while(p != NULL)
            {
                path.push_back(p->val);
                s.push(p);
                p = p->left;
            }
            if(!s.empty())
            {
                p = s.top();
                s.pop();
                p = p->right;
            }
        }
    }
    //非递归中序遍历
    void inorderTraversal(TreeNode *root, vector<int> &path)
    {
        stack<TreeNode *> s;
        TreeNode *p = root;
        while(p != NULL || !s.empty())
        {
            while(p != NULL)
            {
                s.push(p);
                p = p->left;
            }
            if(!s.empty())
            {
                p = s.top();
                path.push_back(p->val);
                s.pop();
                p = p->right;
            }
        }
    }
    //非递归后序遍历-迭代
    struct node{
        int data;
        node *left;
        node *right;
    };
    struct BTNode{
        node *btnode;
        bool isfirst;
    };
    void postorderTraverse(node *root)
    {
        stack<BTNode *> s;
        node *p = root;
        BTNode *temp;
        while (p != NULL || !s.empty())
        {
            while (p != NULL)
            {
                BTNode *btn = (BTNode *)malloc(sizeof(BTNode));
                btn->btnode = p;
                btn->isfirst = true;
                s.push(btn);
                p = p->left;
            }
            if (!s.empty())
            {
                temp = s.top();
                s.pop();
                if (temp->isfirst == true)
                {
                    temp->isfirst = false;
                    s.push(temp);
                    p = temp->btnode->right;
                }
                else
                {
                    cout << temp->btnode->data << " ";
                    p = NULL;
                }
            }
        }
    }

链接文章中给出了统一的的遍历解法

链接:http://zisong.me/post/suan-fa/geng-jian-dan-de-bian-li-er-cha-shu-de-fang-fa

前序遍历,中序遍历,后序遍历的通用解法(不太好理解,建议常规做法)

链接:https://leetcode.com/discuss/9736/accepted-code-with-explaination-does-anyone-have-better-idea
关于二叉树遍历地这段思想很好
There is an universal idea for preorder traversal inorder traversal and postorder traversal. For each node N, we process it as follows:
——- push N in stack -> push left tree of N in stack -> pop left tree of N -> push right tree of N in stack -> pop right tree of N -> pop N———
For preorder traversal, we visit a node when pushing it in stack. For inorder traversal, we visit a node when pushing its right child in stack.
For postorder traversal, we visit a node when popping it. lastpop represents the node which is popped the last time. For the top node in stack,
it has three choices, pushing its left child in stack, or pushing its right child in stack, or being popped. If lastpop != top->left, meaning that its left tree has not been pushed in stack, then we push its left child. If last_pop == top->left, we push its right child. Otherwise, we pop the top node.

void preorder_traversal_iteratively(TreeNode* root ) 
{
    if (root == 0 )
        return;
    stack<TreeNode *> s;
    s.push (root);
    cout << root ->val << ' ' ; // visit root
    TreeNode* last_pop = root;
    while (!s. empty())
    {
        TreeNode * top = s.top();
        if ( top->left != 0 && top->left != last_pop && top->right != last_pop) // push_left
        {
            s .push( top->left );
            cout << top-> left->val << ' ' ; // visit top->left
        }
        else if (top->right != 0 && top->right != last_pop && (top ->left == 0 || top->left == last_pop)) // push_right
        {
            s .push( top->right );
            cout << top-> right->val << ' ' ; // visit top->right
        }
        else // pop
        {
            s .pop();
            last_pop = top;
        }
    }
}
void inorder_traversal_iteratively(TreeNode* root )
{
    if (root == 0 )
        return;
    stack<TreeNode *> s;
    s.push (root);
    TreeNode* last_pop = root;
    while (!s. empty())
    {
        TreeNode * top = s.top();
        if ( top->left != 0 && top->left != last_pop && top->right != last_pop) // push_left
        {
            s .push( top->left );
        }
        else if (top->right != 0 && top->right != last_pop && (top ->left == 0 || top->left == last_pop)) // push_right
        {
            s .push( top->right );
            cout << top-> val << ' '; // visit top
        }
        else // pop
        {
            s .pop();
            last_pop = top;
            if ( top->right == 0 )
                cout << top-> val << ' '; // visit top
        }
    }
}
void postorder_traversal_iteratively(TreeNode* root )
{
    if (root == 0 )
        return;
    stack<TreeNode *> s;
    s.push (root);
    TreeNode* last_pop = root;
    while (!s. empty())
    {
        TreeNode * top = s.top();
        if ( top->left != 0 && top->left != last_pop && top->right != last_pop) // push_left
        {
            s .push( top->left );
        }
        else if (top->right != 0 && top->right != last_pop && (top ->left == 0 || top->left == last_pop)) // push_right
        {
            s .push( top->right );
        }
        else // pop
        {
            s .pop();
            last_pop = top;
            cout << top-> val << ' '; // visit top
        }
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

二叉树遍历的通用非递归算法.pdf

  • 2007年12月12日 23:01
  • 403KB
  • 下载

二叉树遍历前序非递归算法

  • 2015年06月09日 16:00
  • 2KB
  • 下载

二叉树遍历递归和非递归算法总结

非原创,但在原创的基础上稍作修改 import java.util.ArrayList; import java.util.HashSet; import java.util.List;...
  • mackie
  • mackie
  • 2013年03月27日 15:08
  • 161

二叉树遍历(递归调用的算法)

  • 2010年12月04日 01:21
  • 560KB
  • 下载

二叉树遍历算法总结(剑指offer23、编程之美3.10)

1.二叉树结点的数据结构struct BinaryTreeNode { char m_chChildTag; //后序遍历时用于标识其最新一次访问的是左孩子还是右孩子 char m_chData;...

(1.2.5.2)二叉树遍历算法的应用

中心:利用递归思想,分为左右子树分别计算 (1)二叉树的创建 先序创建 int create(btree $bt){ scanf(&ch); if(ch=='') T=Null; else ...

第十周项目2-二叉树遍历的递归算法

copyright (c) 2016,烟台大学计算机学院    All rights reserved.    文件名称:1.cpp    作者:孟令康   完成日期:2016年9月1...

Morris二叉树遍历算法

在遍历儿叉树时,常常使用的是递归遍历,或者是借助于栈来迭代,在遍历过程中,每个节点仅访问一次,所以这样遍历的时间复杂度为O(n),空间复杂度为O(n),并且递归的算法易于理解和实现,二叉树的递归遍历算...

第十周 项目2-二叉树遍历的递归算法

/* 文件名称:main.cpp作者 :王超完成日期:2015年11月2日问题描述:二叉树遍历的递归算法*/#include #include #include "btree.h" void...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:二叉树遍历算法总结
举报原因:
原因补充:

(最多只允许输入30个字)