演算法框架之二叉樹擴充套件 二叉搜尋樹

2022-09-13 19:12:10 字數 2833 閱讀 1191

二叉樹基礎遍歷 在上一章以解釋過 演算法框架之陣列&鍊錶&二叉樹

【如何判斷兩棵二叉樹是否完全相同?

先來道開胃菜 應該很好理解 一共會出現三種情況【空的情況(都空+乙個空)+非空情況+遞迴】

/*

* * definition for listnode.

* function listnode (val) */

/*** @param root1

* @param root2 */

*/function

issame(root1,root2)

1.在談論寫法前 先必須知道其定義吧二叉搜尋樹(binary search tree,簡稱 bst)是一種很常用的的二叉樹。它的定義是:乙個二叉樹中,任意節點的值要大於等於左子樹所有節點的值,且要小於等於右邊子樹的所有節點的值。

【下圖就是乙個二叉搜尋樹】

可能想通過上面的【二叉樹框架】+【二叉搜尋樹定義】依葫蘆畫瓢 搞乙個出來 **如下

function

isvalidbst(root)

看似十分正確!滿足【每乙個子樹】 左《根《右 的要求 下圖即滿足寫的這個演算法 但明顯不滿足【二叉搜尋樹的定義】!(右側的子樹應該也都大於結點 但6與根10不滿足)

是否是框架不適用了?亦或者是開頭就想錯了? 並不!!只需稍作修改即可

先分析為什麼不滿足情況?

因為 只考慮了子樹結點情況 ,並沒考慮之前的根節點情況  因此只需 將其記錄 每一項的【最大值/最小值】即可

/*

** definition for a binary tree node.

* function treenode(val)

*//*

* * @param root */

function

isvalidbst(root)

function

isvalidbst(root, min, max)

先來看看普通的樹如何找值呢?

function

find(root,target)

那在對二叉搜尋樹找值時 是否有好的方法呢? 或者說利用【二叉樹的特性】

function

find(root, target)

由上述2,3點+【二叉搜尋樹定義】可得框架

/*

* * definition for a binary tree node.

* function treenode(val) */

/*** @param root

* @param target */

function

bst(root, target)

說到底 就是【二叉搜尋樹之查】的修改版 => 先查到位置 再新建結點 加入即可

注:一般增加操作要求返回根結點

function

insertintobst(root, val)

刪除是最麻煩的乙個操作 要分三種情況【無孩子】【有乙個孩子】【有左右孩子】

1、無孩子

十分方便 只需將其刪除即可

2、有乙個孩子

將其替代之前的位置

排除了情況 1 之後

if (root.left == null) return

root.right;

if (root.right == null) return root.left;

3、有兩個孩子此種情況最為麻煩:

1.刪除本值,尋找左子樹的最大值/右子樹的最小值,替換位置

由於只需替換一種 此處用替換左子樹最大值為例:

if (root.left != null && root.right != null

)

4、 整體【二叉搜尋樹之刪】框架

function deletenode(root, int

key)

else

if (root.val >key)

else

if (root.val

return

root;

}//找左子樹中的最大值【找左子樹的最右下角的值】

function

getmax(node)

二叉樹 還原二叉樹 二叉搜尋樹

先序遍歷的特點 先遍歷根結點,再遍歷左子樹,最後再遍歷右子樹 中序遍歷的特點 先遍歷左子樹,再遍歷根結點,最後再遍歷右子樹 後序遍歷的特點 先遍歷左子樹,再遍歷右子樹,最後再遍歷根結點 舉例 先序遍歷 a b d f g h i e c 中序遍歷 f d h g i b e a c 如上,根據先序遍...

樹 二叉樹 二叉搜尋樹

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

二叉樹之 二叉樹深度

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