前序,中序,后序递归遍历二叉树

测试例子:输入ab#d##c#e##

输出:abdce

            bdace

            dbeca

 

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<stack>
using namespace std;
struct Node {
	Node *rchild;
	Node *lchild;
	char data;
};
int loc;
#if 0
Node *create()
{
	Tree[loc].lchild = Tree[loc].rchild = NULL;
	return &Tree[loc++];
}
#endif
Node *createtree(Node *bt)
{
	char c;
	cin >> c;
	if (c == '#') {
		bt == NULL;
		//return ;
	}
	else {
		bt = new Node;
		bt->data = c;
		bt->lchild = createtree(bt->lchild);
		bt->rchild = createtree(bt->rchild);
	}
	return bt;
}
void preOrder(Node *bt)
{

	if (bt != NULL)
	{
		printf("%c", bt->data);
		if (bt->lchild)
			preOrder(bt->lchild);
		//printf("%c",bt->data);
		if (bt->rchild)
			preOrder(bt->rchild);
		//printf("%c",bt->data);
	}
	//printf("\n");
}
void inOrder(Node *bt)
{

	if (bt != NULL)
	{
		//printf("%c",bt->data);
		if (bt->lchild)
			inOrder(bt->lchild);
		printf("%c", bt->data);
		if (bt->rchild)
			inOrder(bt->rchild);
		//printf("%c",bt->data);
	}
	//printf("\n");
}
void postOrder(Node *bt)
{

	if (bt != NULL)
	{
		//printf("%c",bt->data);
		if (bt->lchild)
			postOrder(bt->lchild);
		//printf("%c",bt->data);
		if (bt->rchild)
			postOrder(bt->rchild);
		printf("%c", bt->data);
	}
	//printf("\n");
}

//非递归
void PreOrderStack(Node *bt) {
	stack<Node*> pre;
	Node *cur = bt;
    //pre.push(cur);   
	 while (!cur || !pre.empty()) {
        while(cur!=null){
          printf("%c", cur->data);
          pre.push(cur);
          cur = cur->lchild;             
        }	        			       	 
	 if(!pre.empty()) {
		cur = pre.top();
		pre.pop();
		cur = cur->rchild;
	 }
   }
 
}
void InOrderStack(Node *bt) {
	stack<Node*> In;
	Node *cur = bt;
	while (!cur || !In.empty()) {
        while(cur!=null){
		In.push(cur);
		cur = cur->lchild;
	   }
	  if(!In.empty()) {
		cur = In.top();
		printf("%c", cur->data);
		In.pop();
		cur = cur->rchild;
	}
   }
}

//要保证根结点在左孩子和右孩子访问之后才能访问,因此对于任一结点P,先将其入栈。
//如果P不存在左孩子和右孩子,则可以直接访问它;或者P存 在左孩子或者右孩子,但是其左孩子和右孩子都已被访问过了,则同样可以直接访问该结点。
//若非上述两种情况,则将P的右孩子和左孩子依次入栈,这样就保证了 每次取栈顶元素的时候,左孩子在右孩子前面被访问,左孩子和右孩子都在根结点前面被访问。

void PostOrderStack(Node *bt) {
	stack<Node*> post;
	Node *cur = bt;
	Node *pre = NULL;
	post.push(bt);
	while (!post.empty()) {
		cur = post.top();
		if ((cur->lchild == NULL&&cur->rchild == NULL) || (pre != NULL && (pre == cur->rchild || pre == cur->lchild))) {
			printf("%c", cur->data);
			post.pop();
			pre = cur;
		}
		else {
			if (cur->rchild) //注意栈的先进后出,所以右子树先进
				post.push(cur->rchild);
			if (cur->lchild)
				post.push(cur->lchild);
			
		}
	}
	
	
}
int main()
{
	loc = 0;
	Node *bt;
	bt = createtree(bt);
	preOrder(bt);
	printf("\n");
	inOrder(bt);
	printf("\n");
	postOrder(bt);
	printf("\n");
	//system("pause");
	return 0;
}


 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值