二元查找树的后序遍历结果

题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回 true ,否则返回 false

例如输入576911108,由于这一整数序列是如下树的后序遍历结果:

         8
       /  \
      6    10
    / \    / \
   5   7   9  11

因此返回true

#include <iostream>
#include <stack>
using namespace std;
//节点
struct node
{
	node *lchild,*rchild;
	int value;
};

//二元查找树
class list
{
public:
	list();
	bool PostOrder_verify(int sequence[],int length);
private:
	node* root;
};

bool list::PostOrder_verify(int sequence[],int length)
{
	//如果root为空,返回false
	if(NULL==root)
		return false;
	stack<node*> s;
	int temp_length=0;
	//temp为临时节点,判断出栈条件
	node *curr=root,*temp=NULL;
	while(1){
		while(curr){
			s.push(curr);
			curr=curr->lchild;
		}
		if(s.empty())
			break;
		curr=s.top();
		if(NULL==curr->rchild || temp==curr->rchild){
			//原先输出后序遍历的位置
			//cout<<curr->value<<'\t';
			if(temp_length==length)
				return false;
			//如果不等就返回false
			if(curr->value!=sequence[temp_length++])
				return false;
			temp=curr;
			s.pop();
			curr=NULL;
		}
		else
			curr=curr->rchild;
	}
	//如果数组长度长于树长度,返回false
	if(temp_length!=length-1)
		return false;
	else
	    return true;
}


list::list()
{
	cout<<"请输入您要输入的节点,按'#'退出:"<<endl;
	int i;
	//用cin.fail(),cin.bad()判断也行
	if(cin>>i==NULL){
      cout<<"您的输入有误"<<endl;
	  exit(-1);
	}
	//创建根节点
	root=new node;
	root->value=i;
	root->lchild=NULL;
	root->rchild=NULL;
	//建立两个临时节点,p开辟新节点,q为二元查找定位
	node *p,*q;
	while(cin>>i!=NULL){
		//开辟新节点
		p=new node;
		p->value=i;
		p->lchild=NULL;
		p->rchild=NULL;
		//二元查找树比较从q=root开始,小则转左,大则转右,如果有位置就插入
		q=root;
		while(1){
			//插入节点小于该节点比较值,左节点为空则插入,否则q=q->lchild继续判断
			if(p->value<q->value){
				if(q->lchild)
					q=q->lchild;
				else{
					q->lchild=p;
					break;
				}
			}
			//插入节点大于该节点比较值,右节点为空则插入,否则q=q->rchild继续判断
			else if(p->value>q->value){
				if(q->rchild)
					q=q->rchild;
				else{
					q->rchild=p;
					break;
				}
			}
			//如果两节点相等,直接退出程序(有些暴力)
			else{
				cout<<"node repeated!!"<<endl;
				exit(-1);
			}
		}
	}
}

void main()
{
	int sequence[]={7,6,4,11,12,10};
	int length=sizeof(sequence)/sizeof(int);
	list test;
	cout<<test.PostOrder_verify(sequence,length)<<endl;
	system("pause");
}


 

 

posted @ 2013-03-27 21:42  xinyuyuanm  阅读(208)  评论(0编辑  收藏  举报