在介紹二叉樹之前,先介紹一下樹的概念。
生活中常見的樹都是由樹根、莖幹、樹枝和樹葉組成的。資料結構中的樹把樹枝分叉處、樹葉、樹根抽象為節點,樹根抽象為根節點。對一棵樹來說只有乙個根節點,樹葉稱之為葉子節點,且葉子節點不再延伸出新的節點,把樹枝和莖幹抽象為邊,一條邊只能用來連線兩個節點。在資料結構中一般把根節點置於置於最上方,然後向下延伸若干條邊到達子節點。數的一些性質如下:
沒有節點的樹稱之為空樹;
樹的層次從根節點開始算起,根節點為第一層,根節點的子樹的根節點為第二層,以此類推;
節點的子樹的棵數稱之為節點的度,樹中節點的最大的度稱之為樹的度;
樹中不存在環,所以樹的邊數等於節點數減一;
葉子節點是度為零的節點,當一棵樹只有乙個根節點時,根節點也可以稱之為葉子節點;
節點的深度是指從根節點(深度為1)開始,向下逐層累加至該節點時的深度值;
節點的高度是指從最底層的葉子節點開始開始逐層向上累加至該節點的高度值;
二叉樹的遞迴定義:
要麼二叉樹沒有根節點,是一顆空樹;
要麼二叉樹由根節點,左子樹、右子樹組成,且左子樹和右子樹都是二叉樹
遞迴定義通俗來講:在乙個家族裡面,可以把爺爺說成父親的父親,而曾祖父可以說成父親的父親的父親,這樣家族裡面的所有男性都可以用父親這樣的遞迴定義來定義了。
二叉樹的每個節點的子節點的個數不超過2,同時二叉樹的左子樹和右子樹是嚴格區分的,不能隨意交換。
下面以陣列為例,將陣列中的元素建立為二叉樹的節點,示例一下二叉樹的基本操作,**如下:
#includestruct node //定義節點
;node* newnode(int data) //建立新節點
void insert(node* &root,int data) //插入節點
if(data%2==0) // 為偶數 則插入左子樹
else // 為奇數 則插入左子樹 }
node* creat(int data,int n) //建立二叉樹函式
int main()
; //定義測試陣列
node* root=null; //定義根節點
root=creat(data,10);
preorder(root) ; //呼叫遍歷函式
}
在二叉樹的遍歷中,除了先序遍歷,還有中序遍歷、後續遍歷和層序遍歷,都是用遞迴的方法。**如下:
#include#includeusing namespace std;
void inorder(node* root) //中序遍歷
inorder(root->left);
printf("%d ",root->data);
inorder(root->right);
}void posorder(node* root) //後序遍歷
posorder(root->left);
posorder(root->right);
printf("%d ",root->data);
}void layerorder(node* root) //層序遍歷
if(now->right!=null)
}}
可以看出,先序遍歷、中序遍歷和後續遍歷的順序指的是根節點的書序,即先序遍歷的訪問順序是:根節點->左子樹->右子樹。
中序遍歷的訪問順序是:左子樹->根節點->右子樹;後序遍歷的訪問順序是:左子樹->右子樹->根節點。
資料結構 二叉樹 2 平衡二叉樹 3
前面分析了平衡二叉樹是怎麼調整平衡的,這裡就來解決另乙個問題,平衡二叉樹理論為什麼能成立?難道就不會有怎麼調都不會平衡的情況嗎?一起 一下吧。我在很早的時候就注意到了乙個問題。上圖中是一顆不平衡的二叉樹向平衡調整的一部分過程,這個過程中我發現,子樹a,b,c,d的左右關係始終都是不變的,就是從左到右...
資料結構 二叉樹 反轉二叉樹
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...