資料結構複習——二叉樹的表示及遍歷
阿新 • • 發佈:2019-02-01
一、常用概念
1.一棵有N個結點的樹有N-1條邊
2.結點的度:結點的子樹個數
3.樹的度:樹的所有結點中最大的度數
4.一棵樹採用 firstChild-nextSibling 表示方法可以轉換為二叉樹
5.二叉樹的子樹有左右之分,二叉樹有5中基本形式
6.滿二叉樹:深度為k,共有2^k-1個結點
7.完全二叉樹:按序號對應
二、二叉樹遍歷
typedef struct treeNode * PTree; struct treeNode{ //樹的結點定義 int Data; PTree Left; PTree Right; }; /* *二叉樹的遍歷 */ /* --------------------遞迴遍歷-----------------------------*/ //遞迴前序遍歷 void preTravel(PTree tree){ if(tree){ printf("%d ", tree->Data); preTravel(tree->Left); preTravel(tree->Right); } } //遞迴中序遍歷 void inTravel(PTree tree){ if(tree){ inTravel(tree->Left); printf("%d ", tree->Data); inTravel(tree->Right); } } //遞迴後序遍歷 void afterTravel(PTree tree){ if(tree){ afterTravel(tree->Left); afterTravel(tree->Right); printf("%d ", tree->Data); } } /* --------------------非遞迴遍歷-----------------------------*/ //非遞迴中序遍歷 void inTravel2(PTree tree){ PStack s = initStack(); //初始化一個空棧 PTree t; while(t || !isEmpty(s)){ while(t){ push(s, t); t = t->Left; } if(!isEmpty(s)){ t = pop(s); printf("%d ", t->Data); t = t->Right; } } } //非遞迴先序遍歷 //非遞迴中序遍歷 void preTravel2(PTree tree){ PStack s = initStack(); //初始化一個空棧 PTree t; while(t || !isEmpty(s)){ while(t){ printf("%d ", t->Data); push(s, t); t = t->Left; } if(!isEmpty(s)){ t = pop(s); t = t->Right; } } }