二叉樹之二分搜尋樹

2021-09-24 11:23:55 字數 2434 閱讀 6862

樹的基本知識:

節點的度:子節點的個數

葉子結點:終端節點,節點的度為0的結點

節點的高度:節點距離葉子結點的最長路徑

節點的深度:根節點到節點的最長路徑

樹的高度:根節點的高速

節點的層數:深度+1

樹的特性:

1.子樹不相交

2.除了根節點之外,每個節點有且只有乙個父節點

3.一棵n個節點的樹有n-1條邊。

樹的儲存:

1.陣列儲存:順序儲存,適合完全二叉樹(堆就是完全二叉樹),否則會有空間浪費

2.鍊錶儲存:二叉鍊錶:

class node

三叉鏈:

class node

樹的結構優勢:方便查詢和刪除等操作。

二叉樹:最多只有兩個子樹(每個節點最多只有兩個子節點)

二叉樹是具有天然遞迴特性的資料結構;遞迴的出口就是葉子結點。

滿二叉樹:乙個二叉樹的每一層節點數都達到了最大值。

每層的節點個數為2^(n-1);n為層數

總節點數:2^n-1;

樹的高度:節點個數為n,樹的高度:h=log2(n+1)

完全二叉樹:除了最後一層的節點可以不滿以外,所有層的節點數都要達到最大值,並且最後一層節點都要靠左排列。

二叉搜尋樹是使用最多的二叉樹,它的特點:

1.根節點一定大於左子樹的所有節點,一定小於右子樹的所有節點

2.不包含重複元素

3.元素可比較(定義泛型繼承comperable,實現元素可比較)

二叉樹的遍歷:

1.深度優先遍歷(所有資料結構的深度優先遍歷的非遞迴實現都是借助棧來實現,模擬作業系統中的棧)

1)前序:先訪問乙個結點的根節點,在訪問左子樹,最後訪問右子樹(當前根節點第一次被訪問時輸出,一般用前序遍歷來輸出二叉樹)口訣【根左右】

2)中序:先訪問左子樹再根節點最後右子樹(當前根節點第二次被訪問時輸出):二叉搜尋樹的排序結果就是中序遍歷。

3)後序:先訪問左子樹再訪問右子樹最後訪問根(當前根節點第三次被訪問時輸出):應用場景:記憶體釋放。

2.廣度優先遍歷(作業系統中用佇列實現,借助佇列)

層序遍歷:用於搜尋策略:用於無權圖的最短路徑;

刪除任意節點操作時,先找到該節點的前驅或者後繼節點,再替換。

前驅節點:以當前root為根節點二叉樹中小於二叉樹root的最大值節點。

後集結點:以當前節點為根節點二叉樹中小於二叉樹中root節點的最小值。

floor:小於該值在二叉樹中的最大值節點

ceil:大於該值在二叉樹中最小值節點

二分搜尋樹對樹的結構沒有要求,對值有要求(比當前根節點小的節點一定在根的左邊,大的在右邊)

二分搜尋樹查詢的時間複雜度o(height)與樹高成正比;時間複雜度為o(log2n)

** 二分搜尋樹的最小值不一定是葉子結點,一直向左遞迴,直到走不動為止,這時候的結點就是最小值,最大值就是一直向右遞迴到走不動為止**

二分搜尋樹的新增操作核心**:

/**

* 以指定的node為根節點,插入指定元素e

* 插入的值剛好是當前樹的根節點,直接返回

* @param e

* @return

*/private void add(node node,e e)else if(e.compareto(node.data)<0&&node.left==null)else if(e.compareto(node.data)>0&&node.right==null)

//遞迴子樹,插入資料

if(e.compareto(node.data)<0)else if(e.compareto(node.data)>0)

}查詢指定元素是否存在核心**:

/** * 遞迴尋找

*/private boolean contains(node node,e e)

if(node.data.equals(e))else if(e.compareto(node.data)<0)else

}

哈夫曼樹又稱為最優二叉樹或最優搜尋二叉樹,是一種帶權路徑長度最短的二叉樹。

在很多應用中,常常賦給樹中節點乙個有某種意義的實數,稱此實數為該節點的權。

從樹根節點到該節點之間的路徑長度與該節點上權的乘積稱為節點的帶權路徑長度(wpl)

樹中所有葉子結點的帶權路徑長度之和稱為該樹的帶權路徑長度。

演算法思想:

1)以權值分別為w1,w2…wn的n個節點,構成n棵二叉樹t1,t2…tn並組成森林f=,其中每棵二叉樹ti僅有乙個權值為wi的根節點。

2)在f中選取兩棵根節點權值最小的樹作為左右子樹構造一棵新的二叉樹,並且置新二叉樹根節點權值為左右子樹根節點的權值之和

(根節點權值=左右孩子權值之和,葉子結點的權值=wi)

3)從f中刪除這兩棵二叉樹,同時將新二叉樹放到f中;

4)重複2,3的操作直到f中只含有一棵二叉樹為止,這棵樹就是哈夫曼樹。

樹之二叉樹

二叉樹是每個結點最多有兩個子樹的有序樹。通常子樹的根被稱作 左子樹 left subtree 和 右子樹 right subtree 二叉樹常被用作二叉查詢樹和二叉堆或是二叉排序樹。滿二叉樹 在二叉樹的第i 層上有2 i 1 個結點,深度為k的二叉樹有2 k 1個結點的二叉樹。則此二叉樹稱為 滿二叉...

樹 二叉樹 二叉搜尋樹

給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。假設乙個二叉搜尋樹具有如下特徵 節點的左子樹只包含小於當前節點的數。節點的右子樹只包含大於當前節點的數。所有左子樹和右子樹自身必須也是二叉搜尋樹。示例 1 輸入 2 13輸出 true 示例 2 輸入 5 14 3 6輸出 false 解釋 輸入為 ...

二叉樹之 二叉樹深度

二叉樹深度 獲取最大深度 public static int getmaxdepth treenode root 二叉樹寬度 使用佇列,層次遍歷二叉樹。在上一層遍歷完成後,下一層的所有節點已經放到佇列中,此時佇列中的元素個數就是下一層的寬度。以此類推,依次遍歷下一層即可求出二叉樹的最大寬度 獲取最大...