線性結構之 二叉樹的遍歷

2021-10-06 14:54:04 字數 2096 閱讀 6724

1.遍歷

所謂二叉樹的遍歷,是指按某條搜尋路徑訪問樹中的每個結點,使得每個結點均被訪問一次,而且僅被訪問一次。

由二叉樹的遞迴定義可知,遍歷一棵二叉樹便要決定對根結點n、左子樹l和右子樹r的訪問順序。按照先遍歷左子樹再遍歷右子樹的原則,常見的遍歷次序有先序(nlr)、中序(lnr)和後序(lrn)三種遍歷演算法,其中,序指的是根節點在何時被訪問。除了上述三種遍歷,還有層次遍歷,前三種一般使用深度優先搜尋(dfs)實現,而層次遍歷一般用廣度優先搜尋(bfs)實現。

2.先序遍歷

二叉樹的遞迴定義中的遞迴邊界是二叉樹是一棵空樹,即在遞迴訪問子樹時,如果碰到子樹為空,那麼就說明到達了邊界。

先序遍歷的操作過程:

如果二叉樹為空,什麼也不做,否則

(1)訪問根節點

(2)先序遍歷左子樹

(3)先序遍歷右子樹

先序遍歷遞迴的**如下:

struct node;

void preorder(node* root)

3.中序遍歷

中序遍歷的操作過程為:

如果二叉樹為空,什麼也不做,否則:

(1)中序遍歷左子樹

(2)訪問根節點

(3)中序遍歷右子樹

中序遍歷遞迴**如下:

void inorder(node* root)
4.後序遍歷

後序遍歷的操作過程為:

如果二叉樹為空,什麼也不做,否則:

(1)後序遍歷左子樹

(2)後序遍歷右子樹

(3)訪問根節點

後序遍歷遞迴**如下:

void postorder(node* root)
5.層次遍歷

層次遍歷是指按層次的順序從根節點向下逐層進行遍歷,且對同一層的結點為從左到右遍歷。層次遍歷就相當於對二叉樹從根節點開始的廣度優先搜尋,基本思路如下:

(1)將根節點root加入佇列q

(2)取出隊首結點,訪問它

(3)如果該結點有左孩子結點,將左孩子入隊

(4)如果該結點有右孩子,將右孩子入隊

(5)返回(2),直到隊列為空。

**如下:

void layerorder(node* root) 

}

6.二叉樹的靜態實現

靜態二叉鍊錶是指,結點的左右指標域使用int型代替,用來表示左右子樹的根節點在陣列中的下標。為此需要建立乙個大小為結點上限個數node型陣列,所有動態生成的結點都直接使用陣列中的結點,所有對指標的操作都改為對陣列下標的訪問。結點node的定義如下:

struct nodenode[maxn];  //結點陣列,maxn為結點上限個數
結點的動態生成就可以轉變為如下的靜態指定:

int index = 0;

int newnode(int v)

//查詢,root為根節點在陣列中的下標

void search(int root, int x, int newdata)

search (root->lchild, x, newdata);

search(root->rchild, x, newdata);

} //插入

void insert(int &root, int x)

if(由二叉樹的性質x應該插在左子樹)

else

return root; //返回二叉樹的根節點下標

}//建立二叉樹,函式返回根節點root的下標

int create(int data, int n)

//中序遍歷

void inorder(int root)

//後序遍歷

void postorder(int root)

//層次遍歷

void layerorder(int root)

}

非遞迴演算法遍歷

資料結構之二叉樹的遍歷

先序遍歷 void preorder node root 中序遍歷 void inorder node root 後續遍歷 void postorder node root 層次遍歷 void level node root if p rchild null 如果右子樹不空,則右子樹根節點入隊 下面...

(4 2)樹與二叉樹之二叉樹的遍歷

typedef struct bitreenode bitreenode,bitree void preorder bitree bt typedef struct bitreenode bitreenode,bitree void inorder bitree bt typedef struct ...

演算法之二叉樹各種遍歷

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