读书人

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

发布时间: 2013-03-29 14:24:52 作者: rapoo

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

例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果:

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为空,返回falseif(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;//如果不等就返回falseif(curr->value!=sequence[temp_length++])return false;temp=curr;s.pop();curr=NULL;}elsecurr=curr->rchild;}//如果数组长度长于树长度,返回falseif(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");}


读书人网 >编程

热点推荐