leetcode 二叉樹 驗證二叉搜尋樹

2021-09-26 23:43:08 字數 2006 閱讀 2841

給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。

假設乙個二叉搜尋樹具有如下特徵:

節點的左子樹只包含小於當前節點的數。

節點的右子樹只包含大於當前節點的數。

所有左子樹和右子樹自身必須也是二叉搜尋樹。

示例 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 由於至少要講每乙個節點都訪問一次...