标签:
二叉树的遍历
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