二叉樹基礎遍歷 在上一章以解釋過 演算法框架之陣列&鍊錶&二叉樹
【如何判斷兩棵二叉樹是否完全相同?】
先來道開胃菜 應該很好理解 一共會出現三種情況【空的情況(都空+乙個空)+非空情況+遞迴】
/*1.在談論寫法前 先必須知道其定義吧二叉搜尋樹(binary search tree,簡稱 bst)是一種很常用的的二叉樹。它的定義是:乙個二叉樹中,任意節點的值要大於等於左子樹所有節點的值,且要小於等於右邊子樹的所有節點的值。* * definition for listnode.
* function listnode (val) */
/*** @param root1
* @param root2 */
*/function
issame(root1,root2)
【下圖就是乙個二叉搜尋樹】
可能想通過上面的【二叉樹框架】+【二叉搜尋樹定義】依葫蘆畫瓢 搞乙個出來 **如下
function看似十分正確!滿足【每乙個子樹】 左《根《右 的要求 下圖即滿足寫的這個演算法 但明顯不滿足【二叉搜尋樹的定義】!(右側的子樹應該也都大於結點 但6與根10不滿足)isvalidbst(root)
是否是框架不適用了?亦或者是開頭就想錯了? 並不!!只需稍作修改即可
先分析為什麼不滿足情況?
因為 只考慮了子樹結點情況 ,並沒考慮之前的根節點情況 因此只需 將其記錄 每一項的【最大值/最小值】即可
/*先來看看普通的樹如何找值呢?** definition for a binary tree node.
* function treenode(val)
*//*
* * @param root */
function
isvalidbst(root)
function
isvalidbst(root, min, max)
function那在對二叉搜尋樹找值時 是否有好的方法呢? 或者說利用【二叉樹的特性】find(root,target)
function由上述2,3點+【二叉搜尋樹定義】可得框架find(root, target)
/*說到底 就是【二叉搜尋樹之查】的修改版 => 先查到位置 再新建結點 加入即可* * 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 != null4、 整體【二叉搜尋樹之刪】框架)
function deletenode(root, intkey)
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 二叉樹寬度 使用佇列,層次遍歷二叉樹。在上一層遍歷完成後,下一層的所有節點已經放到佇列中,此時佇列中的元素個數就是下一層的寬度。以此類推,依次遍歷下一層即可求出二叉樹的最大寬度 獲取最大...