|
結(jié)構(gòu) 二叉樹的遍歷一、樹由于樹有一個(gè)不包含回路的特點(diǎn),因此樹被賦予了許多特性,如下所示:
通常情況下,我們在對樹進(jìn)行討論的時(shí)候,將一棵樹中的每個(gè)點(diǎn)稱為結(jié)點(diǎn):
每個(gè)結(jié)點(diǎn)有一個(gè)深度的概念,例如上圖左邊的樹,4號結(jié)點(diǎn)深度是3。 二、二叉樹1. 基本概念2. 二叉樹的存儲結(jié)構(gòu)特點(diǎn):
二叉樹中有兩種比較特殊的二叉樹:滿二叉樹、完全二叉樹,對于滿二叉樹和完全二叉樹可以按照層次進(jìn)行順序存儲。 滿二叉樹:二叉樹中每個(gè)內(nèi)部結(jié)點(diǎn)都存在左子樹和右子樹滿二叉樹一定是完全二叉樹,但完全二叉樹不一定是滿二叉樹。 滿二叉樹的嚴(yán)格定義:一顆深度為h且具有2h-1個(gè)結(jié)點(diǎn)的二叉樹。 完全二叉樹:二叉樹相關(guān)名詞解釋:
二叉樹基本性質(zhì):
存儲方式 實(shí)現(xiàn)代碼: #include <stdio.h>#include <stdlib.h>#define N 10typedef struct node{ char data; struct node *lchild; /* 左子樹 */ struct node *rchild; /* 右子樹 */}BiTNode, *BiTree;void CreatBiTree (BiTree *T) /* BiTree *T等價(jià)于 struct node **T */{ char ch; scanf("%c", &ch); if (ch == '#') /* 當(dāng)遇到#時(shí),令樹的結(jié)點(diǎn)為NULL,從而結(jié)束該分支的遞歸 */ { *T = NULL; } else { *T = (BiTree)malloc(sizeof(BiTNode)); if (*T == NULL) { printf("內(nèi)存分配失敗"); exit(0); } (*T)->data = ch; /* 生成結(jié)點(diǎn) */ CreatBiTree(&(*T)->lchild); /* 構(gòu)造左子樹 */ CreatBiTree(&(*T)->rchild); /* 構(gòu)造右子樹 */ /* 這里需要注意的是->的優(yōu)先級比&高,所以&(*T)->lchild得到的是lchild的地址 */ }}int main(){ int level = 1; BiTree t = NULL; printf("以前序遍歷方式輸入二叉樹\n"); CreatBiTree(&t); /* 傳入指針的地址 */}上面的實(shí)現(xiàn)代碼使用的是鏈表,代碼采用的是以前序遍歷方式輸入二叉樹,當(dāng)輸入“#”時(shí),指針指向NULL,說明是該結(jié)點(diǎn)是葉結(jié)點(diǎn)。 三、二叉樹的遍歷(前序/中序/后序遍歷)順序:訪問根節(jié)點(diǎn)->前序遍歷左子樹->前序遍歷右子樹 /* 以遞歸方式 前序遍歷二叉樹 */void PreOrderTraverse(BiTree t, int level){ if (t == NULL) { return ; } printf("data = %c level = %d\n ", t->data, level); PreOrderTraverse(t->lchild, level + 1); PreOrderTraverse(t->rchild, level + 1);}中序遍歷:首先遍歷左子樹,然后訪問根節(jié)點(diǎn),最后遍歷右子樹(左->根->右) 順序:中序遍歷左子樹->訪問根節(jié)點(diǎn)->中序遍歷右子樹 /* 以遞歸方式 中序遍歷二叉樹 */void PreOrderTraverse(BiTree t, int level){ if (t == NULL) { return ; } PreOrderTraverse(t->lchild, level + 1); printf("data = %c level = %d\n ", t->data, level); PreOrderTraverse(t->rchild, level + 1);}/* 以遞歸方式 后序遍歷二叉樹 */void PreOrderTraverse(BiTree t, int level){ if (t == NULL) { return ; } PreOrderTraverse(t->lchild, level + 1); PreOrderTraverse(t->rchild, level + 1); printf("data = %c level = %d\n ", t->data, level);} |
|
|