zoukankan      html  css  js  c++  java
  • C语言 二叉树的遍历(递归和非递归)

    #include <iostream>
    #include <cstdio>
    #include "biTree.h"
    #include "cstdlib"
    #define OVERFLOW -1
    #include <stack>
    using namespace std;
    
    Status CreateBiTree( BiTree &T ) {
    	int a;
    	printf( "Creating BiTree .....
    " );
    	printf( "input: <number>:" );
    	scanf( "%d",&a );
    	if ( a==0 ) {
    		T=NULL;
    		}
    	else {
    		T=( BiTree )malloc( sizeof( BiTNode ) );
    		if ( !T )
    			exit( OVERFLOW );
    		T->data=a;
    		CreateBiTree( T->lchild );
    		CreateBiTree( T->rchild );
    		}
    	return OK;
    	}
    
    Status PreOrderTraverse( BiTree T,Status( * Visit )( TElemtype e ) ) {
    	if ( T ) {
    		Visit( T->data );
    		PreOrderTraverse( T->lchild,Visit );
    		PreOrderTraverse( T->rchild,Visit );
    		}
    	return OK;
    	}
    
    Status InOrderTraverse( BiTree T,Status( *Visit )( TElemtype e ) ) {
    	if ( T ) {
    		InOrderTraverse( T->lchild,Visit );
    		Visit( T->data );
    		InOrderTraverse( T->rchild,Visit );
    		}
    	return OK;
    	}
    
    Status PostOrderTraverse( BiTree T,Status( *Visit )( TElemtype e ) ) {
    	if ( T ) {
    		PostOrderTraverse( T->lchild,Visit );
    		PostOrderTraverse( T->rchild,Visit );
    		Visit( T->data );
    		}
    	return OK;
    	}
    
    Status InOrderTraverseNoDG( BiTree T,Status( *Visit )( TElemtype e ) ) {
    	stack<BiTree> st;
    	BiTree p=NULL;
    	st.push( T );
    	while ( !st.empty() ) {
    		while ( ( p=st.top() )&&p ) {
    			st.push( p->lchild );
    			}
    		st.pop();//走到头然后继续往右
    		if ( !st.empty() ) {
    			p=st.top();
    			st.pop();
    			if ( !Visit( p->data ) )
    				return ERROR;
    			st.push( p->rchild ); //输出根之后 在栈顶(当前节点)继续往左循环
    			}
    		}
    	return OK;
    	}
    
    
    Status PreOrderTraverseNoDG( BiTree T,Status( *Visit )( TElemtype e ) ) {
    	stack<BiTree> st;
    	BiTree p=NULL;
    	st.push( T );
    	while ( !st.empty() ) {
    		while ( ( p=st.top() )&&p ) {
    			if ( !Visit( p->data ) )
    				return ERROR;
    			st.push( p->lchild );
    			}
    		st.pop();//走到头然后继续往右
    		if ( !st.empty() ) {
    			p=st.top();
    			st.pop();
    			st.push( p->rchild ); //输出根之后 在栈顶(当前节点)继续往左循环
    			}
    		}
    	return OK;
    	}
    
    
    
    
    Status PostOrderTraverseNoDG( BiTree T,Status( *Visit )( TElemtype e ) )
    
    	{
    	/*
    	   如果不使用标志位区分第几次到达根结点,
    	   可以利用如下的后序遍历特征来完成:当栈顶元素(根)的右子树为空(即:无右孩子),
    	   或者是右子树非空但是已遍历完,即右孩子恰好是刚才访问过的结点,
    	   此时应访问栈顶结点,并在访问后退栈
    	   否则,如果栈顶元素的右孩子非空且未遍历,
    	   此时直接访问栈顶元素的右孩子而不退栈,
    	   算法要点只是需要记住最近访问过的结点即可
    	*/
    	BiTree p=T;
    	stack <BiTree> st;
    	BiTree have_visited=NULL;
    	while ( NULL!=p||!st.empty() ) {
    		while ( NULL!=p ) {
    			st.push( p );
    			p=p->lchild;
    			}
    		p=st.top();
    		if ( NULL==p->rchild||have_visited==p->rchild ) {
    			Visit( p->data );
    			st.pop();
    			have_visited=p;
    			p=NULL;
    			}
    		else {
    			p=p->rchild;
    			}
    		}
    	return OK;
    	}
    
    int main() {
    	BiTree newBiT;
    	CreateBiTree( newBiT );
    	printf( "先序遍历结果
    " );
    	PreOrderTraverse( newBiT,Visit );
    	printf( "
    中序遍历结果
    " );
    	InOrderTraverse( newBiT,Visit );
    	printf( "
    后序遍历结果
    " );
    	PostOrderTraverse( newBiT,Visit );
    	printf( "
    ---非递归中根---
    " );
    	InOrderTraverseNoDG( newBiT,Visit );
    	printf( "
    ---非递归先根---
    " );
    	PreOrderTraverseNoDG( newBiT,Visit );
    	printf( "
    ---非递归后根---
    " );
    	PostOrderTraverseNoDG( newBiT,Visit );
    	return 0;
    	}
    


  • 相关阅读:
    SQVI和SAP查询QUERY的区别和使用注意事项
    hdu 4119 Isabella's Message
    HaProxy+Keepalived+Mycat高可用群集配置
    Android之RecyclerView简单使用(三)
    2.CCGridAction(3D效果),3D反转特效,凸透镜特效,液体特效,3D翻页特效,水波纹特效,3D晃动的特效,扭曲旋转特效,波动特效,3D波动特效
    怎样cp文件夹时忽略指定的文件夹和文件
    使用boost::property_tree生成带attribute的xml
    数据结构:中序线索二叉树
    像音乐播放App一样移动背景
    【EasyUi】页面设计必学之Layout
  • 原文地址:https://www.cnblogs.com/slankka/p/9158571.html
Copyright © 2011-2022 走看看