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的結點 ...