二叉树前序、中序、后序三种遍历(C++)

前序遍历递归算法:

void PreOrder(Node *bt)//形参为结构体类型的指针
{
  if(bt==NULL)return;//递归调用的结束条件
  else{
    cout<<bt->data;//访问根结点的data值
    PreOrder(bt->lchild);//前序递归遍历bt左子树
    PreOrder(bt->rchild);//前序递归遍历bt右子树
       }
}

中序遍历递归算法:

void IneOrder(Node *bt)//形参为结构体类型的指针
{
  if(bt==NULL)return;//递归调用的结束条件
  else{
    InOrder(bt->lchild);//中序递归遍历bt左子树
    cout<<bt->data;//访问根结点的data值
    InOrder(bt->rchild);//中序递归遍历bt右子树
       }
}

后序遍历递归算法:

void PostOrder(Node *bt)//形参为结构体类型的指针
{
  if(bt==NULL)return;//递归调用的结束条件
  else{
    PostOrder(bt->lchild);//后序递归遍历bt左子树
    PostOrder(bt->rchild);//后序递归遍历bt右子树
    cout<<bt->data;//访问根结点的data值 
      }
}

前序非递归算法伪代码:(中序与前序类似)

1.栈s初始化;

2.循环直到bt为空且栈s为空

     2.1 当bt不为空时循环

         2.1.1 输出bt->data;

        2.1.2 将指针bt保存至栈中;

        2.1.3 继续遍历bt的左子树;

   2.2 如果s不空时,则

        2.2.1 将栈顶元素弹出至bt;

        2.2.2 准备遍历bt的右子树;

构造一个二叉树,输出前中后序遍历的三种序列c++实现如下:

#include <iostream>
using namespace std;
struct BiNode
{
	char data;
	BiNode *rchild, *lchild;
};
class BiTree
{
public :
	BiTree() { root=Creat(root); }//构造函数,建立一个二叉树
	~BiTree() { Release(root); }//析构函数,释放各结点的存储空间
	void Pre() { PreOrder(root); }//前序遍历
	void In() { InOrder(root); }//中序遍历
	void Psot() { PostOrder(root); }//后序遍历
private:
	char ch;
	BiNode *root;//指向根结点的头指针
	BiNode * Creat(BiNode *bt);
	void Release(BiNode *bt);
	void PreOrder(BiNode *bt);
	void InOrder(BiNode *bt);
	void PostOrder(BiNode *bt);//共有成员函数的调用
};
BiNode * BiTree::Creat(BiNode *bt)
{
	cin >> ch;//输入结点数据信息
	if (ch == '#') bt=NULL;//建立一个空树,当输入“#”时表示到达叶结点
	else {
		bt = new BiNode; bt->data = ch;//生成结点,将输入的值赋给data
		bt->lchild =Creat(bt->lchild);
		bt->rchild =Creat(bt->rchild);//递归建立左右子树
	}
	return bt;
}
void BiTree::Release(BiNode *bt)
{
	if (bt != NULL) {
		Release(bt->lchild);
		Release(bt->rchild);//递归释放左右子树,从叶结点开始释放
		delete bt;//释放根结点
	}
}
void BiTree::PreOrder(BiNode *bt)
{
	BiNode *s[10];
	int top = -1;//采用顺序栈,假定不发生上溢
	while (bt != NULL || top != -1)//跳出循环的条件,没有叶结点以及栈为空
	{
		while (bt!=NULL)//直到的叶结点
		{
			cout << bt->data;//输出data值,前序和中序仅这一语句的位置不相同
			s[++top] = bt;//根指针入栈
			bt=bt->lchild;
		}
		if (top!=-1)//栈不为空时
		{
			bt = s[top--];//出栈操作
			bt = bt->rchild;
		}
	}
}
void BiTree::InOrder(BiNode *bt)//中序遍历与前序类似,略微有差别
{
	BiNode *s[10];
	int top = -1;
	while (bt != NULL || top!= -1)
	{
		while (bt != NULL)
		{
			s[++top] = bt;
			bt = bt->lchild;
		}
		if (top != -1)
		{
			bt =s[top--];
			cout << bt->data;
			bt = bt->rchild;
		}
	}
}
void BiTree::PostOrder(BiNode *bt)
{
	if(bt == NULL) return;
	else
	{
		PostOrder(bt->lchild);
		PostOrder(bt->rchild);
		cout << bt->data;
	}
}
int main()
{
	BiTree Test;
	cout << "The PreOrder is:" << endl;
	Test.Pre();
	cout <<endl<< "The InOrder is:" << endl;
	Test.In();
	cout <<endl<< "The PostOrder is"<<endl;
	Test.Psot();
	return 0;
}


 
 
 

猜你喜欢

转载自blog.csdn.net/song_10/article/details/85083077