二叉樹首先是一棵樹,每個節點都不能有多於兩個的兒子,也就是樹的度不能超過2。二叉樹的兩個兒子分別稱為「左兒子」和「右兒子」,次序不能顛倒。如圖1是乙個簡單的二叉樹。
二叉樹的種類
一種是滿二叉樹,除了最後一層的葉子節點外,每一層的節點都必須有兩個兒子節點。如圖2是乙個滿二叉樹。
另一種是完全二叉樹,一棵二叉樹去掉最後一層後剩下的節點組成的樹為滿二叉樹,最後一層的節點從左到右連續,沒有空出的節點,這樣的樹稱為完全二叉樹。如圖3是一棵完全二叉樹。
二叉樹的初始化
因為一棵樹有最多只有兩個兒子,所以我們可以用指標直接指向他們。乙個節點包括值(data)、指向左兒子的指標(lson)和指向右兒子的指標(rson)。
二叉樹的插入,刪除,查詢和鍊錶差不多,不同的是需要指定是左兒子還是右兒子。
二叉樹的陣列實現也很簡單,假如說根節點在arr[0]這個位置,那麼它的左兒子就在arr[2*0+1],也就是arr[1]這個位置,它的右兒子在arr[2*0+2] ,也就是arr[2]這個位置。對於下標為i的節點來說,它的左兒子的下標為2*i+1,右兒子的下標為2*i+2。
二叉樹的遍歷
二叉樹的遍歷有三種,分別為先序遍歷,中序遍歷和後序遍歷。這三種遍歷方式是根據根節點的讀取順序來分的:
先序遍歷,就是最先讀取根節點,然後再讀取左子樹(按照同樣的方法讀取子樹上的節點),最後讀取右子樹;
中序遍歷,就是第二個讀取根節點,最先要讀取的是左子樹,然後根節點,最後右子樹;
後序遍歷,就是最後乙個讀取根節點,最先讀取的是左子樹,第二個讀取右子樹,最後讀取根節點。
//定義二叉樹結構體
struct treenode;
//因為實際問題處理中,樹和遞迴的思想是緊密聯絡在一起的。
//前、中、後各自遍歷的核心在於樹根的位置出在三個中哪個位置,左孩子永遠高於右孩子
//前序遍歷
void insubtree(struct treenode*tree)
cout
insubtree(tree->lson);//這裡體現出了遞迴的思想,因為在遍歷左孩子的時候必須要判斷其下還有沒有元素。
//同時也體現了前序遍歷不管在哪都是前序遍歷
insubtree(tree->rson);
}
資料結構 二叉樹 反轉二叉樹
include using namespace std define maxsize 1000 struct binary tree node class queue queue queue void queue push binary tree node btn binary tree node ...
《資料結構》 二叉樹
二叉樹 是 n個結點的有限集,它或為空集,或由乙個根結點及兩棵互不相交的 分別稱為該根的左子樹和右子樹的二叉樹組成。二叉樹不是樹的特殊情況,這是兩種不同的資料結構 它與無序樹和度為 2的有序樹不同。二叉樹的性質 1 二叉樹第 i層上的結點數最多為 2 i 1 2 深度為 k的二叉樹至多有 2 k 1...
資料結構 二叉樹
1.二叉樹 二叉樹是一種特殊結構的樹,每個節點中最多有兩個子節點,如圖1所示 圖1 二叉樹 在圖1中的二叉樹裡,a c有兩個子節點,b d有乙個子節點。對於二叉樹還有圖2中的以下情況 圖2 二叉樹的特殊情況 在博文中還介紹了滿二叉樹和完全二叉樹還有其他的特殊二叉樹。2.二叉樹的實現 有兩種實現方式,...