二叉树的存储和遍历

前导知识:

结点的层次:规定根结点在1层, 其它任一结点的层数是其父结点的层数加1。

树的深度:树中最大的结点层次。(从根节点往下)

二叉树定义:一个有穷的结点集合,这个集合可以为空;若不为空,则它是由根结点和称为其左子树和右子树的两个不相交的二叉树组成。

二叉树具有5种基本形态:

二叉树的几个重要性质:

(1)一个二叉树第i层的最大结点数为:2^{i-1},i\geqslant 1

(2)深度为k的二叉树拥有的最大结点数为:2^{k}-1,k\geqslant 1。

(3)对任何非空二叉树 T,若n0表示叶结点的个数、n2是度为2的非叶结点个数,那么两者满足关系n0 = n2 +1。

二叉树的存储结构—链表存储:
 

typedef  struct  TreeNode  *BinTree;

typedef  BinTree Position;

struct  TreeNode{  ElementType  Data;  BinTree  Left;  BinTree  Right; }

二叉树的遍历:

递归写法,以先序遍历为例,采用堆栈:

void PreOrderTraversal( BinTree BT ) {    

     if( BT ) {        

     printf(“%d”, BT->Data);        

     PreOrderTraversal( BT->Left );        

     PreOrderTraversal( BT->Right );    

     }

}

非递归写法,以先序遍历为例:

void InOrderTraversal( BinTree BT ) {  

    BinTree T=BT; 

    Stack S = CreatStack( MaxSize ); /*创建并初始化堆栈S*/ 

    while( T || !IsEmpty(S) ){     

        while(T){   /*一直向左并将沿途结点压入堆栈*/         

            printf(“%5d”, T->Data); /*(访问)打印结点*/     

            Push(S,T);          

            T = T->Left;      

        }     

        if(!IsEmpty(S)){     /*栈不为空*/   

            T = Pop(S); /*结点弹出堆栈*/         

            T = T->Right; /*转向右子树*/     

        } 

    } 

}

 

层序遍历,采用队列:

void LevelOrderTraversal ( BinTree BT ) {   

    Queue Q;  

    BinTree T; 

    if ( !BT ) return; /* 若是空树则直接返回 */ 

    Q = CreatQueue( MaxSize ); /*创建并初始化队列Q*/ 

    AddQ( Q, BT ); 

    while ( !IsEmptyQ( Q ) ) {     

        T = DeleteQ( Q ); 

        printf(“%d\n”, T->Data); /*访问取出队列的结点*/ 

        if ( T->Left )  AddQ( Q, T->Left ); 

        if ( T->Right ) AddQ( Q, T->Right ); 

        } 

} 

 

示例:

层序遍历=>13,10,15,9,12,14,16

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值