zoukankan      html  css  js  c++  java
  • 非递归实现的前中后序遍历

    数据结构定义

    typedef struct BTNode{
    	int data;
    	BTNode * lchild=NULL;
    	BTNode * rchild=NULL;
    	BTNode(int d):data(d){
    	}
    }BTNode;
    

    非递归前序

    void pre_order_norRecursion(BTNode* p){
    	BTNode* S[LEN];	//定义工作栈
    	int top=-1;		//栈顶指针
    	S[++top] = p;	//根节点入栈
    	while(top>=0){
    		BTNode* node=S[top--];
    		visit(node);
    		if(node->rchild)
    			S[++top] = node->rchild;
    		if(node->lchild)
    			S[++top] = node->lchild;
    	} 
    }
    

    非递归中序

    void in_order_norRecursion(BTNode* p){
    	BTNode* S[LEN];	//定义工作栈
    	int top=-1;		//栈顶指针
    //	S[++top] = p;	//不需要根节点入栈 
    	while(top>=0 || p){//栈空p空 停止循环 
    		while(p){		//移最左下 
    			S[++top]=p;
    			p=p->lchild;
    		} 
    		if(top>=0){		//出栈置右 
    			p=S[top--];
    			visit(p);
    			p=p->rchild;
    		}
    	}
    }
    

    口诀:

    • 栈空p空 停止循环
    • 移最左下
    • 出栈置右

    非递归后序

    void post_order_norRecursion(BTNode* p){
    	BTNode* S[LEN];	//定义工作栈
    	int top=-1;		//栈顶指针
    	BTNode* r=NULL;	//指向最近访问过的节点 
    	while(top>=0 || p){//栈空p空 停止循环 
    		while(p){	//移最左下 
    			S[++top]=p;
    			p=p->lchild;
    		}
    		if(top>=0){		
    			p=S[top];	//查看栈顶结点 
    			if(p->rchild && p->rchild!=r){	//右存未访 
    				p=p->rchild;				//压右入左 
    				S[++top]=p;
    				p=p->lchild;
    			}else{
    				p=S[top--];		//否则出栈 
    				visit(p);
    				r=p;
    				p=NULL;
    			}
    		}
    	}
    }
    

    口诀:

    • 栈空p空 停止循环
    • 移最左下
    • 右存未访 压右入左
    • 否则出栈

    完整代码

    #include <bits/stdc++.h> 
    #define LEN 100
    
    using namespace std;
    
    typedef struct BTNode{
    	int data;
    	BTNode * lchild=NULL;
    	BTNode * rchild=NULL;
    	BTNode(int d):data(d){
    	}
    }BTNode;
    
    BTNode* create_demo_tree(){
    	BTNode* rt=new BTNode(1);
    	BTNode* rt_l=rt->lchild=new BTNode(2);
    	rt->rchild=new BTNode(4);
    	rt_l->lchild=new BTNode(3);
    	rt_l->rchild=new BTNode(5);
    	return rt;
    }
    
    int visit(BTNode* p){
    	cout<<p->data<<' ';
    }
    
    int in_order(BTNode* p){
    	if(p){
    		in_order(p->lchild);
    		visit(p);
    		in_order(p->rchild);
    	}
    }
    
    void pre_order_norRecursion(BTNode* p){
    	BTNode* S[LEN];	//定义工作栈
    	int top=-1;		//栈顶指针
    	S[++top] = p;	//根节点入栈
    	while(top>=0){
    		BTNode* node=S[top--];
    		visit(node);
    		if(node->rchild)
    			S[++top] = node->rchild;
    		if(node->lchild)
    			S[++top] = node->lchild;
    	} 
    }
    
    void in_order_norRecursion(BTNode* p){
    	BTNode* S[LEN];	//定义工作栈
    	int top=-1;		//栈顶指针
    //	S[++top] = p;	//不需要根节点入栈 
    	while(top>=0 || p){//栈空p空 停止循环 
    		while(p){		//移最左下 
    			S[++top]=p;
    			p=p->lchild;
    		} 
    		if(top>=0){		//出栈置右 
    			p=S[top--];
    			visit(p);
    			p=p->rchild;
    		}
    	}
    }
    
    void post_order_norRecursion(BTNode* p){
    	BTNode* S[LEN];	//定义工作栈
    	int top=-1;		//栈顶指针
    	BTNode* r=NULL;	//指向最近访问过的节点 
    	while(top>=0 || p){//栈空p空 停止循环 
    		while(p){	//移最左下 
    			S[++top]=p;
    			p=p->lchild;
    		}
    		if(top>=0){		
    			p=S[top];	//查看栈顶结点 
    			if(p->rchild && p->rchild!=r){	//右存未访 
    				p=p->rchild;				//压右入左 
    				S[++top]=p;
    				p=p->lchild;
    			}else{
    				p=S[top--];		//否则出栈 
    				visit(p);
    				r=p;
    				p=NULL;
    			}
    		}
    	}
    }
    
    int main(){
    	BTNode* root=create_demo_tree();
    //	in_order(root);
    //	pre_order_norRecursion(root);
    	post_order_norRecursion(root);
    	return 0;
    }
    
  • 相关阅读:
    (八)断路器-Hystrix
    WINDOWS SERVER 2012 虚拟机 忘记密码后
    IIS FTP :在组合的密钥属性“users,roles,permissions”分别设置为“*,Read,Write”时,无法添加类型为“add”的重复集合项
    log4j 日志组件
    IDEA缓存
    com.alibaba.druid.pool.DruidDataSource
    EHCache CacheManager
    webservice调试(XML参数) Wizdler PostMan
    jar类库加载顺序
    JAXB工具
  • 原文地址:https://www.cnblogs.com/TQCAI/p/9420672.html
Copyright © 2011-2022 走看看