二叉樹遍歷的各種演算法

2021-06-20 03:49:39 字數 2457 閱讀 7346

二叉樹的遍歷是指按照一定次序訪問二叉樹中的所有節點,且每個節點僅被訪問一次的過程。是最基本的運算,是其他運算的基礎。

二叉樹有兩種儲存結構:順序儲存和鏈式儲存

順序儲存:(對完全二叉樹來說,可以充分利用儲存空間,但對於一般的二叉樹,只有少數的儲存單元被利用)

[cpp]view plain

copy

typedef

struct

sqbtree;  

鏈式儲存:

[csharp]view plain

copy

typedef 

struct

node  

btnode;  

二叉樹三種遞迴的遍歷方法:

先序遍歷

訪問根節點→先序遍歷左子樹→先序遍歷右子樹

中序遍歷

中序遍歷左子樹→訪問根節點→中序遍歷右子樹

後序遍歷

後序遍歷左子樹→後序遍歷右子樹→訪問根節點

二叉樹遍歷的遞迴演算法:

[cpp]view plain

copy

void

preorder(btnode *b)  

//先序遍歷遞迴演算法

}  void

inorder(btnode *b)   

//中序遍歷遞迴演算法

}  void

postorder(btnode *b)   

//後序遍歷遞迴演算法

}  二叉樹非遞迴遍歷演算法:

有兩種方法:①用棧儲存資訊的方法  ②增加指向父節點的指標的方法    暫時只介紹下棧的方法

先序遍歷:

[cpp]view plain

copy

void

preorder(btnode *b)  

else

}  }  

中序遍歷:

[cpp]view plain

copy

void

inorder(btnode *b)  

if(!s.empty())  

}  }  

後序遍歷:

[cpp]view plain

copy

void

postorder(btnode *b)  

while

(!s.empty())  

else

if(node->left!=null)  

node->bpushed=true

;  //如果標識位為true,則表示入棧

}         

}  }  

層次遍歷演算法:(用佇列的方法)

[cpp]view plain

copy

void

levelorder(btnode *b)  

if(null!=right)  

}  }""

>

已知先序和中序求後序的演算法:(已知後序和中序求先序的演算法類似,但已知先序和後序無法求出中序)

[cpp]view plain

copy

intfind(

char

c,char

a,int

s,int

e) /* 找出中序中根的位置。 */

/* 其中pre表示先序序,pre_s為先序的起始位置,pre_e為先序的終止位置。 */

/* 其中in表示中序,in_s為中序的起始位置,in_e為中序的終止位置。 */

/* pronum()求出pre[pre_s~pre_e]、in[in_s~in_e]構成的後序序列。 */

void

pronum(

char

pre,

intpre_s,

intpre_e,

char

in,int

in_s,

intin_e)  

c=pre[pre_s]; /* c儲存根節點。 */

k=find(c,in,in_s,in_e); /* 在中序中找出根節點的位置。 */

pronum(pre,pre_s+1,pre_s+k-in_s,in,in_s,k-1); /* 遞迴求解分割的左子樹。 */

pronum(pre,pre_s+k-in_s+1,pre_e,in,k+1,in_e); /* 遞迴求解分割的右子樹。 */

printf("%c"

,c); 

/* 根節點輸出。 */

}  main()  

二叉樹 各種遍歷演算法

include include include using namespace std 二叉樹結點 typedef struct bitnodebitnode,bitree 按先序序列建立二叉樹 int createbitree bitree t else return 0 輸出 void visi...

二叉樹的各種遍歷演算法

typedef struct treenode int data struct treenode left struct treenode right int flag 該標記用於後序非遞迴遍歷 ptree 先序遞迴遍歷 void bt preorder ptree root if root nul...

演算法之二叉樹各種遍歷

樹形結構是一類重要的非線性資料結構,其中以樹和二叉樹最為常用。二叉樹是每個結點最多有兩個子樹的有序樹。通常子樹的根被稱作 左子樹 left subtree 和 右子樹 right subtree 二叉樹常被用作二叉查詢樹和二叉堆或是二叉排序樹。二叉樹的每個結點至多只有二棵子樹 不存在度大於2的結點 ...