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;
    }
    
  • 相关阅读:
    VisualSVN-Server windows 版安装时报错 "Service 'VisualSVN Server' failed to start. Please check VisualSVN Server log in Event Viewer for more details."
    Pytest 单元测试框架之初始化和清除环境
    Pytest 单元测试框架入门
    Python(email 邮件收发)
    Python(minidom 模块)
    Python(csv 模块)
    禅道简介
    2020年最好的WooCommerce主题
    Shopify网上开店教程(2020版)
    WooCommerce VS Magento 2020:哪个跨境电商自建站软件更好?
  • 原文地址:https://www.cnblogs.com/TQCAI/p/9420672.html
Copyright © 2011-2022 走看看