演算法與資料結構進階->二叉樹的遍歷實現
阿新 • • 發佈:2021-01-11
樹的基本原理
1、樹形結構是一類重要的非線性資料結構,直觀來看,樹是以分支關係定義的層次結構。
樹(Tree) 是n(n>=0)個結點個有限集合,其中每個集合本身又是一棵樹。並且成為根的子樹。樹的結點包含一個數據元素以及若干指向其子樹的分支。結點擁有的子樹稱為結點的度。度為0的結點稱為葉子結點。度不為0的結點稱為分支結點。樹種結點的最大層次稱為樹的深度,而森林(Forest)是m(m>=0)棵互不相交的數的集合。
瞭解二叉樹的原理和性質
2、二叉樹(Binary tree)是另一種樹形結構,他的特點是每一個結點至多隻有兩棵子樹(即二叉樹中不存在度大於2的結點)並且,二叉樹的子樹有左右之分,其次序不能任意顛倒。
二叉樹的性質
性質一
在二叉樹的第i層上至多有2
(i-1)個結點。
性質二
深度為k的二叉樹至多有2
k-1個結點。
性質三
對任何一棵二叉樹T,如果其終端的結點數為n1,度為2的結點數為n2,則有n1=n2+1。
一棵深度為k且2
k-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("後序遍歷:");