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