3/ \
920/ \
157
二叉樹定義和輔助函式如下:
[cpp]view plain
copy
struct
node ;
void
visit(
intdata)
先序遍歷:先訪問二叉樹的根結點,而後遍歷左子樹,最後遍歷右子樹。先序遍歷二叉樹例項結果為:3 9 20 15 7。遞迴演算法**如下:
[cpp]view plain
copy
void
preorder(
struct
node* root)
中序遍歷:先遍歷二叉樹的左子樹,然後訪問根結點,最後遍歷右子樹。中序遍歷二叉樹例項結果:9 3 15 20 7。遞迴演算法**如下:
[cpp]view plain
copy
void
inorder(
struct
node* root)
後序遍歷:先遍歷二叉樹的左子樹,然後遍歷二叉樹右子樹,最後訪問根結點。後序遍歷二叉樹例項結果:9 15 7 20 3。遞迴演算法**如下:
[cpp]view plain
copy
void
postorder(
struct
node* root)
對於先序遍歷、中序遍歷以及後序遍歷的遞迴演算法,沒有什麼好說的,時間複雜度都為o(n)。而層序遍歷的遞迴演算法則稍微複雜一點,因為本身層序遍歷用非遞迴演算法是很容易實現的,不過使用遞迴演算法**更簡潔,雖然遞迴演算法的效率並不高。層序遍歷二叉樹例項結果:
3遞迴**如下:9 20
15 7
[cpp]view plain
copy
void
printlevel(
struct
node *p,
intlevel)
else
} void
printlevelorder(
struct
node *root)
} 當二叉樹高度為n時,此時遞迴層序遍歷為最壞情況,時間複雜度為o(n^2)。當二叉樹左右子樹基本平衡時,時間複雜度為o(n),分析如下:
設訪問第k層時間為t(k),則t(k)存在如下的遞迴公式:
t(k) = 2t(k-1) + c當二叉樹平衡時,則高度為o(lgn),則總時間為:= 2k-1 t(1) + c
= 2k-1 + c
t(1) + t(2) + ... + t(lg n)= 1 + 2 + 22 + ... + 2lg n-1
+ c= o(n)
二叉樹遍歷 遞迴演算法
一 先序 void pre order const btnode b1 先序 二 中序 void in order const btnode b1 中序 三 後序 void post order const btnode b1 後序 四 層次 void level order 直接插到下面 clas...
二叉樹遍歷之非遞迴演算法
先序遍歷非遞迴訪問,使用棧即可實現。先序遍歷的非遞迴訪問在所有的遍歷中算是最簡單的了。主要思想就是先將根結點壓入棧,然後根結點出棧並訪問根結點,而後依次將根結點的右孩子 左孩子入棧,直到棧為空為止。如下 cpp view plain copy void preorderiter struct nod...
遞迴遍歷二叉樹
include include include 二叉鍊錶表示法 typedef struct tag bitnode bitnode 先序遍歷 void xianxuorder bitnode root 先根 printf c root data 左子樹 xianxuorder root lchil...