二叉树的遍历可分为
前序遍历、中序遍历和后序遍历。要想写出正确的遍历,首先要清楚它们的遍历方式。博主过一段时间会弄混它们的遍历方式,后来总结出了一个规律,再也不会弄混了:
1)遍历中的前,中,后都指的是根结点;
2)左右子结点都是先左后右;
记住这
两点,就再也不怕混
乱了,
不信,你往博文下面看看图解
。
下面将依次介绍树的前、中、后序遍历的递归和非递归的方法:
前序遍历首先访问根结点然后遍历左子树,最后遍历右子树。在遍历左、右子树时,仍然先访问
根结点,然后遍历左子树,最后遍历右子树。
若
二叉树
为空则结束返回,否则:
(1)访问根结点。
(2)前序遍历左子树
。
(3)前序遍历右子树 。
递归代码:
void preOrder1(Bintree *root){
if (root != NULL)
{
cout << root->data;
preOrder(root->lchild);
preOrder(root->rchild);
}
}
循环代码
</pre><p></p><pre code_snippet_id="1641138" snippet_file_name="blog_20160925_3_4867777" name="code" class="cpp">void preOrder2(Bintree *root){
stack<Bintree*> s;
Bintree *p = root;
while(p != NULL || !s.empty()){
while(p != NULL){
cout << p->data << " ";
s.push(p);
p = p->lchild;
}
if (!s.empty())
{
p=s.top();
s.pop();
p= p->rchild;
}
}
}
中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树。在遍历左、右子树时,仍然先遍历左子树,再访问根结点,最后遍历右子树。即:若二叉树为空则结束返回
否则:
(1)中序遍历左子树。
(2)访问根结点。
(3)中序遍历右子树。
递归代码为:
void midOrder1(Bintree *root){
while (root != NULL)
{
midOrder1(root->lchild);
cout << root->data << " ";
midOrder1(root->rchild);
}
}
循环的代码:
void midOrder2(Bintree *root){
stack<Bintree*> s;
Bintree *p = root;
while(p != NULL || !s.empty()){
while(p != NULL){
s.push(p);
p = p->lchild;
}
if (!s.empty())
{
p = s.top();
cout << p->data << " ";
s.pop();
p = p->rchild;
}
}
}
后序遍历首先遍历左子树,然后遍历右子树,最后访问根结点,在遍历左、右子树时,仍然先遍历左子树,然后遍历右子树,最后遍历根结点。即:
若
二叉树为空则结束返回,
否则:
(1)后序遍历左子树 (2)后序遍历右子树 (3)访问根结点
(1)后序遍历左子树 (2)后序遍历右子树 (3)访问根结点
递归代码:
void lastOrder1(Bintree *root){
while(root != NULL){
lastOrder1(root->lchild);
lastOrder1(root->rchild);
cout << root->data;
}
}
循环代码:
void lastOrder2(Bintree *root){
//stack<Bintree*> s;
stack< pair<Bintree*, bool> > s;
Bintree *p = root;
//s.push(make_pair(root, true));
while(p != NULL){
s.push(make_pair(p, true));
p = p->lchild;
}
if(!s.empty()){
p = s.top().first;
bool flag = s.top().second;
if (flag)
{
s.top().second = false;
s.push(make_pair(p->rchild, true));
}
else
{
cout << p->data << " ";
s.pop();
}
}
}
void lastOrder2(Bintree *root){
//stack<Bintree*> s;
stack< pair<Bintree*, bool> > s;
Bintree *p = root;
//s.push(make_pair(root, true));
while(p != NULL){
s.push(make_pair(p, true));
p = p->lchild;
}
if(!s.empty()){
p = s.top().first;
bool flag = s.top().second;
s.pop();
if (flag)
{
s.push(make_pair(p, flase));
p = p->rchild;
}
else
{
cout << p->data << " ";
p = NULL;
}
}
}