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