数据结构与算法之二叉树
生活随笔
收集整理的這篇文章主要介紹了
数据结构与算法之二叉树
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
二叉樹
數組,鏈表和樹的比較
數組的優缺點:
- 優點:通過索引方式訪問元素,速度非常快,時間復雜度為O(1)。對于有序數組,還可以使用二分查找來提高查找的速度。
- 缺點:如果要查找某個具體的值,時間復雜度為O(n),如果要在數組中插入某個值(按一定順序)會整體的移動,效率較低。
鏈表的優缺點:
- 優點:插入一個值,只需要創建一個節點并將節點鏈接到鏈表中即可。
- 缺點:在進行查找時,效率仍然較低,需要從頭節點開始遍歷,時間復雜度為O(n)。
樹的優點:能提高數據存儲和讀取的效率,比如利用二叉搜索樹,既可以保證數據的查找速度,同時也可以保證數據的插入,刪除,修改的速度。
樹(Tree)
樹的常用術語(結合示意圖理解):
- 節點:A、B、C、D、E、F、G、H。
- 根節點:A。
- 父節點:B是D和E的父節點。
- 子節點:B是A的子節點。
- 兄弟節點:D和E的父節點都是B、所以D的兄弟節點是E。
- 路徑:從一個節點到另一個節點的路線。
- 層數:根節點A在第一層,根節點的子節點B和C在第二層,以此類推(有的教程也從0開始計數)。
- 左子樹:節點B和節點B的子節點構成的樹稱為節點A的左子樹。
- 右子樹:節點C和節點C的子節點構成的樹稱為節點A的右子樹。
- 森林:多棵子樹構成森林。
- 節點的度:子節點或子樹的個數。
- 樹的度:所有節點中度的最大值。
- 葉子節點:沒有子節點的節點,度為0的節點。
- 非葉子節點:度不為0的節點。
- 節點的深度(depth):從根節點到當前節點的唯一路徑上的節點總數(包含根節點和當前節點)。
- 節點的高度(height):從當前節點到最遠葉子節點的路徑上的節點總數(包含當前節點和最遠葉子節點)。
- 樹的深度:所有節點深度中的最大值。
- 樹的高度:所有節點高度中的最大值。
樹的基本性質:
- 一棵樹可以沒有任何節點,為空樹。
- 一棵樹也可以只有一個節點,也就是根節點。
- 樹的深度等于樹的高度。
二叉樹(Binary Tree)
二叉樹:每個節點最多只能有兩個子節點的樹,也就是每個節點的度最大為2。
二叉樹的特點:
- 每個節點的度最大為2,節點的度可以為0、1、2。
- 即使某個節點只有一個子節點,也要區分左右子節點。
二叉樹的性質:
- 在非空二叉樹的第i層,最多有2^(i-1)個節點(i>=1)。
- 在高度為h的樹上,最多有2^h-1個節點(h>=1)。
- 對于任意一棵非空二叉樹,如果葉子節點的個數為n0,度為2的節點個數為n2,則有:n0=n2+1。
2^h-1的推導:
在高度為h的樹上,樹的高度即為層數,第一層最多有2^0個節點,第二層最多有2^1個節點...第n層最多有2^(h-1)個節點 設S為總節點個數,那么: S=2^0+2^1+2^2+...+2^(h-1) (公式1) 2S=2*(2^0+2^1+2^2+...+2^(h-1))=2^1+2^2+...+2^h (公式2) 使用公式2減去公式1得出S=2^h-2^0=2^h-1n0=n2+1的推導:
已知非空二叉樹的葉子節點個數為n0,度為2的節點個數為n2,假設度為1的節點個數為n1,那么有: 樹的總節點個樹為n=n0+n1+n2 樹的邊條數為t=n1+2*n2(度為1的節點有一條邊,度為2的節點有兩條邊)=n-1(每個節點頭上都有一條邊,除了根節點)=n0+n1+n2-1(將上面的n的公式代入) 即有n1+2*n2=n0+n1+n2-1,消除左右公共項,得出n2=n0-1,也就是n0=n2+1真二叉樹(Proper Binary Tree)
真二叉樹:所有節點的度要么為0,要么為2。
滿二叉樹(Full Binary Tree)
滿二叉樹:最后一層節點的度都為0,其他節點的度都為2。
滿二叉樹是一棵特殊的真二叉樹。
在同樣高度的二叉樹中,滿二叉樹的葉子節點數量最多、總節點數量最多。
假設滿二叉樹的高度為h(h>=1),那么:
- 第i層的節點數量:2^(i?1)。
- 葉子節點數量(也就是最后一層的節點數量):2^(h?1)。
- 總節點數量n=2^h-1,那么h=log2(n+1)。
完全二叉樹(Complete Binary Tree)
完全二叉樹:二叉樹的所有葉子節點都在最后一層或者倒數第二層,而且最后一層的葉子節點在左邊連續,倒數第二層的葉子節點在右邊連續。
完全二叉樹從根結點至倒數第2層是一棵滿二叉樹。
滿二叉樹是一棵特殊的完全二叉樹。
完全二叉樹的性質:
- 度為1的節點要么只有一個,要么沒有。
- 度為1的節點只有左子節點。
- 同樣節點數量的二叉樹,完全二叉樹的高度最小。
- 假設完全二叉樹的高度為h(h>=1),總節點的數量為n,那么有h=floor(log2(n))+1。
h=floor(log2(n))+1的推導:
已知完全二叉樹的高度為h(h>=1),總節點的數量為n: 那么總節點數量至少有2^0+2^1+2^2+...+2^(h-1)+1=2^(h-1)個(從根節點到倒數第二層的滿二叉樹+最后一層一個節點), 最多有2^0+2^1+2^2+...+2^h=2^h-1個(滿二叉樹), 即2^(h-1)<=n<=2^h-1<2^h 對等式兩邊取對數得出:h-1<=log2(n)<h 由于h是整數,所以h=floor(log2(n)) floor是向下取整,ceiling是向上取整,另外在計算機中整數的除法默認是向下取整。一棵有n個節點的完全二叉樹(n>0),從上到下、從左到右對節點從1開始進行編號,對任意第i個節點:
- 如果i=1,它是根節點。。
- 如果i>1,它的父節點編號為floor(i/2)。
- 如果2i<=n,它的左子節點編號為2i。
- 如果2i>n ,它無左子節點,也無右子節點。
- 如果2i+1<=n,它的右子節點編號為2i+1。
- 如果2i+1>n,它無右子節點。
一棵有n個節點的完全二叉樹(n>0),從上到下、從左到右對節點從0開始進行編號,對任意第i個節點:
- 如果i=0,它是根節點。
- 如果i>0,它的父節點編號為floor(i/2)。
- 如果2i+1<=n–1,它的左子節點編號為2i+1。
- 如果2i+1>n–1,它無左子節點,也無右子節點。
- 如果2i+2<=n–1,它的右子節點編號為2i+2 。
- 如果2i+2>n–1,它無右子節點。
面試題
題目:如果一棵完全二叉樹有768個節點,求葉子節點的個數?
答案:768/2=384
假設完全二叉樹有n個節點,度為0的節點個數為n0,度為1的節點個數為n1,度為2的節點個數為n2,那么有 n=n0+n1+n2,前面有公式n0=n2+1 即n=n0+n1+n0-1=2n0+n1-1 即n0=(n-n2+1)/2 完全二叉樹的n1要么為0,要么為1 當n1為1時,n0=n/2,n一定是偶數 當n1為0時,n0=(n+1)/2,n必然是奇數 總結公式: n0=floor((n+1)/2)=ceiling(n/2) n1+n2=floor(n/2)=ceiling((n–1)/2)更多精彩內容關注本人公眾號:架構師升級之路
總結
以上是生活随笔為你收集整理的数据结构与算法之二叉树的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: srb (bug篇)
- 下一篇: 关于离职的经验技巧