二叉树的遍历是二叉树的众多算法的基础。主要有,前序,中序与后序。
对于以下二叉树:
前序:12354
中序:21543
后序:24531
笔者实现了三种遍历方式:
1 前序:递归版本比较简单,只需要改变push_back操作的位置即可。
vector<int> PreOrderTraverse2(TreeNode *root)
{
vector<int> nodes;
vector<int> temp;
if(root == NULL) return nodes;
nodes.push_back(root->val);
temp = PreOrderTraverse2(root->left);
for(vector<int>::size_type i = 0 ; i != temp.size() ; ++i)
nodes.push_back(temp[i]);
temp = PreOrderTraverse2(root->right);
for(vector<int>::size_type i = 0 ; i != temp.size() ; ++i)
nodes.push_back(temp[i]);
return nodes;
}
前序迭代版本,步骤如下:
(1)首先访问根节点root,先将root节点输出,压入堆栈,
(2)再考虑root节点的左子树,左子树也是一颗二叉树,重复(1)。
(3)某一步的左子树为空,那么该节点左子树已访问完毕,弹出栈顶,访问该节点的右子树,重复(1)即可。
很简单,只需要记住,在将节点压入堆栈时,该节点就已被访问,再访问完左孩子之后,再考虑右孩子所在的二叉树。
vector<int> PreOrderTraverse(TreeNode *root)
{
vector<int> nodes;
stack<TreeNode *> s;
if(root