标签:二叉树
递归遍历比较简单,本文主要总结非递归遍历。
前序遍历按照“根结点-左孩子-右孩子”的顺序进行访问。
对于任一结点P:
void preorder(TreeNode *root)
{
stack<TreeNode*> s;
TreeNode *p = root;
while (p != NULL || !s.empty())
{
while (p != NULL)
{
cout<<p->val<<" ";
s.push(p);
p = p->left;
}
if (!s.empty())
{
p = s.top();
s.pop();
p = p->right;
}
}
}
中序遍历按照“左孩子-根结点-右孩子”的顺序进行访问。
对于任一结点P,
void inorder(TreeNode *root)
{
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();
cout<<p->val<<" ";
s.pop();
p = p->right;
}
}
}
后序遍历按照“左孩子-右孩子-根结点”的顺序进行访问。
要保证根结点在左孩子和右孩子访问之后才能访问,因此对于任一结点P,先将其入栈。如果P不存在左孩子和右孩子,则可以直接访问它;或者P存在左孩子或者右孩子,但是其左孩子和右孩子都已被访问过了,则同样可以直接访问该结点。若非上述两种情况,则将P的右孩子和左孩子依次入栈,这样就保证了每次取栈顶元素的时候,左孩子在右孩子前面被访问,左孩子和右孩子都在根结点前面被访问。
void postorder(TreeNode *root)
{
if (root == NULL)
{
return;
}
stack<TreeNode*> s;
s.push(root);
TreeNode *pre = NULL;
TreeNode *cur;
while (!s.empty())
{
cur = s.top();
if (cur->left == NULL && cur->right == NULL ||
pre != NULL && (pre == cur->left || pre == cur->right))
{
cout<<cur->val<<" ";
s.pop();
pre = cur;
}
else
{
if (cur->right != NULL)
{
s.push(cur->right);
}
if (cur->left != NULL)
{
s.push(cur->left);
}
}
}
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:二叉树
原文地址:http://blog.csdn.net/foreverling/article/details/46930365