码迷,mamicode.com
首页 > 其他好文 > 详细

二叉树的遍历(递归和非递归两种方法)

时间:2015-05-15 13:25:27      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:

二叉树的遍历

1、二叉树的定义

(1)C语言版

typedef struct BiNode
{
    ElemType val;
    struct BiNode *left,*right;
}BiNode,*BiTreee;

(2)C++版

struct TreeNode {
    ElemType val;
    TreeNode *left;
    TreeNode *right;
};

  我们可以看到这两种定义的格式是不一样的,自己以前一直是在C++程序中用C语言版的定义。网上不同人采用的也不一样,最终在写二叉树的相关算法时,会有稍微的不同。因此,特别注意二叉树的定义方式,然后再看别人的程序。

  两种方式为什么会不一样呢?

这是因为C和C++中,结构体的定义方式是不同的。可以参考资料http://blog.csdn.net/liyongbao1988/article/details/7642107

(本人喜欢采用C++方式的定义,后文的程序也是C++版的)

 

2、二叉树的先序遍历

(1)递归的方法

  思想:把整棵二叉树看做是一个根节点、左孩子、右孩子,先序遍历就是先访问根结点,再访问左孩子,接着右孩子。由于左、右孩子还可能为一课二叉树,因此再调用自己。

void preorderTraversal_Recursive(TreeNode* root, vector<int>&res)
{
    if (root != NULL)
    {
        res.push_back(root->val);
        preorderTraversal_Recursive(root->left,res);
        preorderTraversal_Recursive(root->right,res);
    }
}

(2)非递归方法

  思想:二叉树的非递归先序遍历,先序遍历思想:先让根进栈,只要栈不为空,就可以做弹出操作, 每次弹出一个结点,记得把它的左右结点都进栈,记得右子树先进栈,这样可以保证右子树在栈中总处于左子树的下面。

vector<int> preorderTraversal_Iteratively(TreeNode* root)
{
    vector<int> res;
    if (root == NULL)
        return res;
    stack <TreeNode *> s;
    s.push(root);
    while (!s.empty())
    {
        TreeNode * temp = s.top();
        res.push_back(temp->val);
        s.pop();
        if (temp->right)
            s.push(temp->right);
        if (temp->left)
            s.push(temp->left);
    }
}

  该非递归算法参考的是http://www.cnblogs.com/sooner/archive/2013/04/09/3010654.html,算法实在是很巧妙!

 

二叉树的遍历(递归和非递归两种方法)

标签:

原文地址:http://www.cnblogs.com/acode/p/4505568.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!