zoukankan      html  css  js  c++  java
  • 二元查找树的后序遍历结果

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


     

  • 相关阅读:
    WorkFlow入门Step.5—Adding Procedural ElementsForWF4.0(后续)
    WorkFlow设计篇Step.5—用户自定义工作流活动WF4.0
    WorkFlow入门Step.8—Flow Switch的用法
    WorkFlow入门Step.6—Building a Console Application ForWF4.0
    WorkFlow设计篇Step.3—异常处理WF4.0
    WorkFlow设计篇Step.4—异常处理(续)WF4.0
    WorkFlow入门Step.7—Creating a FlowChart WorkFlowForWF4.0
    WorkFlow设计篇Step.2—传参的用法订单金额的处理(续)WF4.0
    近来很忙,很少更新了,发个贴顶一下
    [11.17]本站开通一周年纪念
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/2985446.html
Copyright © 2011-2022 走看看