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;
    }
    
  • 相关阅读:
    smarty基础
    phpcms 内容模块PC标签调用
    phpcms v9中的$CATEGORYS栏目数组
    PHP如何实现验证码
    PHP生成一个不重复随机数组的封装方法
    简单实现php文件管理
    PHP-----作业:查询数据,在页面上显示
    PHP-----设计模式六大原则
    PHP-----静态
    PHP-----面向对象的设计模式:工厂模式例题
  • 原文地址:https://www.cnblogs.com/TQCAI/p/9420672.html
Copyright © 2011-2022 走看看