题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回
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为空,返回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");
}