二叉樹遍歷之遞迴演算法

2021-06-08 12:42:47 字數 1522 閱讀 6242

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

= 2k-1 t(1) + c

= 2k-1 + c

當二叉樹平衡時,則高度為o(lgn),則總時間為:

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...