二叉樹的遍歷是按照一定次序
訪問樹中所有節點,並且每個節點僅被訪問一次
的過程。遍歷是二叉樹中最基本的運算,也是樹中插入、刪除、修改、查詢和排序運算的基礎。
對於上面這棵二叉樹來說,它的遍歷方式有三種:先序遍歷,中序遍歷,後序遍歷。
先序遍歷:根節點 –> 左子樹 –> 右子樹(a - b - d - g - c - e - f)
中序遍歷:左子樹 –> 根節點 –> 右子樹(d - g - b - a - e - c - f)
後序遍歷:左子樹 –> 右子樹 –> 根節點(g - d - b - e - f - c - a)
先序遍歷二叉樹的過程:訪問根節點,遍歷左子樹,遍歷右子樹
void preorder(btnode *b)
}
我們來看一下二叉樹的先序遍歷的遞迴演算法呼叫過程:
根據先序遍歷的遞迴演算法來看:
1. preorder(a)先訪問根節點
2. preorder(b)遍歷左子樹,直到遍歷完畢
3. preorder(c)遍歷右子樹,直到遍歷完畢
中序遍歷二叉樹的過程:遍歷左子樹,訪問根節點,遍歷右子樹
後序遍歷二叉樹的過程:遍歷左子樹,遍歷右子樹,訪問根節點
//中序遍歷的遞迴演算法
void inorder(btnode *b)
}//後序遍歷的遞迴演算法
void postorder(btnode *b)
}
二叉樹的層次遍歷是逐層進行訪問,對某一層的節點訪問完後,再按照其訪問次序對各個節點的左、右孩子順序訪問。
因此可以採用乙個環形佇列的方式來實現二叉樹的層次遍歷:先將根節點進隊,節點出隊並訪問,再將左右孩子入隊,迴圈,直到隊空。
void levelorder(binarynode *node)
//若它有右孩子節點,將右孩子節點進隊
if(temp->rchild != null)}}
}
#define _crt_secure_no_warnings
#include
#include
#include
<
string
.h>
//二叉樹結點
typedef struct binarynodebinarynode;
//先序遍歷的遞迴演算法
void preorder(binarynode *node)
}//中序遍歷的遞迴演算法
void inorder(binarynode *node)
}//後序遍歷的遞迴演算法
void postorder(binarynode *node)
}void create_binarytree()
; binarynode node2 = ;
binarynode node3 = ;
binarynode node4 = ;
binarynode node5 = ;
binarynode node6 = ;
binarynode node7 = ;
//建立二叉樹
node1.lchild =
&node2;
node1.rchild =
&node3;
node2.lchild =
&node4;
node3.lchild =
&node5;
node3.rchild =
&node6;
node4.rchild =
&node7;
printf("先序遍歷:");
//先序遍歷
preorder(&node1);
printf("\n");
printf("中序遍歷:");
//中序遍歷
inorder(&node1);
printf("\n");
printf("後序遍歷:");
//後序遍歷
postorder(&node1);
printf("\n");
}int main(void)
測試結果: 二叉樹遍歷演算法
二叉樹是一種非線性的資料結構,在對它進行操作時,總是需要逐一對每個資料元素實施操作,這樣就存在乙個操作順序問題,由此提出了二叉樹的遍歷操作。所謂遍歷二叉樹就是按某種順序訪問二叉樹中的每個結點一次且僅一次的過程。這裡的訪問可以是輸出 比較 更新 檢視元素內容等等各種操作。在這裡寫了個二叉樹遍歷演算法 ...
二叉樹的遍歷演算法
遞迴演算法 void pre root 先序遍歷非遞迴演算法 void pre2 root if s.isempty 中序遍歷非遞迴 void pre2 root if s.isempty 中序遍歷的程式設計題 後序遍歷非遞迴 借助兩個棧來實現 void post if root null retu...
二叉樹的遍歷演算法
二叉樹的遍歷 二叉鍊錶typedef struct btnode btnode,bintree 三叉鍊錶typedef struct btnode btnode,bintree 二叉鍊錶和三叉鍊錶都是用來描繪二叉樹的!一 層序遍歷void levelorder bintree bt define m...