給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。
假設乙個二叉搜尋樹具有如下特徵:
節點的左子樹只包含小於當前節點的數。
節點的右子樹只包含大於當前節點的數。
所有左子樹和右子樹自身必須也是二叉搜尋樹。
示例 1:
輸入:2
/ \1 3
輸出: true
示例 2:
輸入:5
/ \1 4
/ \3 6
輸出: false
解釋: 輸入為: [5,1,4,null,null,3,6]。
根節點的值為 5 ,但是其右子節點值為 4 。
github鏈結
解答該題要注意不僅右子節點要大於該節點,整個右子樹的元素都應該大於該節點
方法一:遞迴
思路:在遍歷樹的同時保留節點的上界與下界,比較時要同時考慮子節點和上下界的值
時間複雜度:o(n) 每個節點訪問一次,判斷該節點是否小於上界及右子節點,大於下界及左子節點。
空間複雜度:o(n) 跟進整個樹
public boolean help_isvalidbst(treenode node,integer lower,integer upper)
public boolean isvalidbst0(treenode node)
方法二:迭代
思路:利用佇列先進先出的特點,迭代進行廣度優先遍歷
時間複雜度:o(n) 每個節點訪問一次
空間複雜度:o(n) 跟進整個樹
public void update(treenode node,integer lower,integer upper,
queuequeue,queuelowers,queueuppers)
public boolean isvalidbst1(treenode node)
return true;
}
方法三:
思路:利用棧後進先出的特點,通過中序遍歷實現深度優先遍歷
注意:中序遍歷對於二叉搜尋樹即可得到由小到大的數
t_left為最左分支,即二叉搜尋樹的最小值
判定過程僅需大於前乙個值即可
public boolean isvalidbst2(treenode node)
node=stack.pop();
if (node!=null)
system.out.println(inorder+" "+node.val+" "+stack.size());
if(node.val<=inorder) return false;
inorder=node.val;
node=node.right;
if (node!=null)
system.out.println(node.val);
} return true;
}
給乙個大牛的**:
思路:利用中序遍歷,僅需一次遞迴呼叫
基於二叉樹的中序遍歷-->從小到大遍歷
定義乙個變數儲存上一遍歷節點的值-->x下界
遞迴遍歷二叉樹
左子樹返回true,對比根結點與快取變數
若4成立,根結點的值賦給快取變數
遞迴遍歷右子樹
LeetCode(驗證二叉樹)
給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。假設乙個二叉搜尋樹具有如下特徵 節點的左子樹只包含小於當前節點的數。節點的右子樹只包含大於當前節點的數。所有左子樹和右子樹自身必須也是二叉搜尋樹。題目分析 輸入 2 1 3輸出 true 思路 一 definition for a binary tr...
leetcode 二叉樹 對稱二叉樹
給定乙個二叉樹,檢查它是否是映象對稱的。例如,二叉樹 1,2,2,3,4,4,3 是對稱的。1 2 2 3 4 4 3 但是下面這個 1,2,2,null,3,null,3 則不是映象對稱的 1 2 2 3 3 方法一 遞迴 思路 如果乙個樹的左子樹與右子樹映象對稱,則該樹是對稱的 兩個樹互為映象的...
LeetCode (二叉樹)反轉二叉樹
遞迴交換每乙個節點的左右子樹,重點在於訪問每乙個節點,然後交換左右子樹 definition for a binary tree node.struct treenode struct treenode inverttree struct treenode root 由於至少要講每乙個節點都訪問一次...