1. 程式人生 > 實用技巧 >演算法與資料結構進階->二叉樹的遍歷實現

演算法與資料結構進階->二叉樹的遍歷實現

樹的基本原理

1、樹形結構是一類重要的非線性資料結構,直觀來看,樹是以分支關係定義的層次結構。

樹(Tree) 是n(n>=0)個結點個有限集合,其中每個集合本身又是一棵樹。並且成為根的子樹。樹的結點包含一個數據元素以及若干指向其子樹的分支。結點擁有的子樹稱為結點的度。度為0的結點稱為葉子結點。度不為0的結點稱為分支結點。樹種結點的最大層次稱為樹的深度,而森林(Forest)是m(m>=0)棵互不相交的數的集合。

瞭解二叉樹的原理和性質

2、二叉樹(Binary tree)是另一種樹形結構,他的特點是每一個結點至多隻有兩棵子樹(即二叉樹中不存在度大於2的結點)並且,二叉樹的子樹有左右之分,其次序不能任意顛倒。

二叉樹的性質
性質一
在二叉樹的第i層上至多有2(i-1)個結點。
性質二
深度為k的二叉樹至多有2k-1個結點。
性質三
對任何一棵二叉樹T,如果其終端的結點數為n1,度為2的結點數為n2,則有n1=n2+1。
一棵深度為k且2k-1個結點的二叉樹稱為滿二叉樹。當且僅當其每一個結點都與深度為k的滿二叉樹中編號1~n的結點都一一對應的時候,稱為完全二叉樹。

二叉樹的遍歷實現

先序遍歷二叉樹的操作定義為:
若二叉樹為空,則空操作;否則
(1)訪問根節點;
(2)先序遍歷左子樹;
(3)先序遍歷右子樹;
中序遍歷,後序遍歷操作同上,只是訪問遍歷的順序不同。
用程式碼去實現二叉樹的三種遍歷如下:

#include <stdio.h>
#include <stdlib.h>
typedef struct bitnode    //二叉連結串列的儲存結構
{
    int data;
    struct bitnode *lchild,*rchild;
}bitnode,*bitree;

void tree(bitree *t)
{
    char ch;
    scanf("%c",&ch);
    if(ch=='#')   //利用#來判斷子樹是否為NULL 
    {
        *t=NULL;
    }
    else {
        if(!(*t=(bitnode *)malloc(sizeof(bitnode))))
            exit(-2);
        (*t)->data=ch;
        tree(&(*t)->lchild);
        tree(&(*t)->rchild);
    }
}
void visit(char ch)  //輸出遍歷後的結果 
{
    printf("%c",ch);
}
void firstBT(bitree t)  //先序遍歷 
{
    if(t)
    {
        visit(t->data);
        firstBT(t->lchild);
        firstBT(t->rchild);
    }
}
void midBT(bitree t)  //中序遍歷 
{
    if(t)
    {
        midBT(t->lchild);
        visit(t->data);
        midBT(t->rchild);
    }
}
void endBT(bitree t)  //後序遍歷 
{ 
    if(t)
    {
        endBT(t->lchild);
        endBT(t->rchild);
        visit(t->data);	
	}
        
}
int main()
{
    bitree t1;  //結構體定義t1
    tree(&t1);
    printf("先序遍歷:");
    firstBT(t1);
    printf("\n");
    printf("中序遍歷:");
    midBT(t1);
    printf("\n");
    printf("後序遍歷:");
    endBT(t1);
    return 0;
}

解讀一下本程式的結果圖~
輸入的時候必須滿足完全二叉樹的性質,即把所有的葉子結點填滿,如果節點為空則用‘#’表示。