給你乙個二叉樹的根節點root
,判斷其是否是乙個有效的二叉搜尋樹。
有效二叉搜尋樹定義如下:
示例 1:
輸入:root = [2,1,3]
輸出:true
例項2:
輸入:root = [5,1,4,null,null,3,6]
輸出:false
解釋:根節點的值是 5 ,但是右子節點的值是 4 。
遞迴有乙個很重要的地方:我們在判斷乙個節點值大小關係的時候,要與它所有的祖先節點進對比,不能只跟父節點對比。所以我們可以定義乙個 遞迴函式reversevalidbst(treenode root, long minvalue, long maxvalue)
。
函式表示考慮以root
為根的子樹,判斷子樹中所有節點的值是否都在(l,r)
的範圍內(注意是開區間)。如果root
節點的值val
不在(l,r)
的範圍內說明不滿足條件直接返回,否則我們要繼續遞迴呼叫檢查它的左右子樹是否滿足,如果都滿足才說明這是一棵二叉搜尋樹。
public boolean isvalidbst(treenode root)
private boolean reversevalidbst(treenode root, long minvalue, long maxvalue)
if (root.val <= minvalue || root.val >= maxvalue)
return reversevalidbst(root.left, minvalue, root.val) && reversevalidbst(root.right, root.val, maxvalue);
}
根據二叉搜尋樹的性質我們可以得到:二叉搜尋樹的中序遍歷是遞增的。所以我們只需要中序遍歷這棵樹。判斷結點的值是不是遞增即可。
/**
* definition for a binary tree node.
* public class treenode
* treenode(int val)
* treenode(int val, treenode left, treenode right)
* }*/class solution
stackqueue = new stack<>();
long lastnumber = long.min_value;
while (!queue.isempty() || root!=null)
root = queue.pop();
if (root.val <= lastnumber)
lastnumber = root.val;
root = root.right;
}return true;}}
leetcode 98 驗證二叉搜尋樹
給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。乙個二叉搜尋樹具有如下特徵 示例 1 輸入 1 3 輸出 true 示例 2 輸入 1 4 3 6 輸出 false 解釋 輸入為 5,1,4,null,null,3,6 根節點的值為 5 但是其右子節點值為 4 關鍵資訊 1二叉搜尋樹的中序遍歷是遞...
leetcode 98 驗證二叉搜尋樹
給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。乙個二叉搜尋樹具有如下特徵 示例 1 輸入 2 1 3 輸出 true示例 2 輸入 5 1 4 3 6 輸出 false 解釋 輸入為 5,1,4,null,null,3,6 根節點的值為 5 但是其右子節點值為 4 解題思路 中序遍歷遞增,每次只...
leetcode 98 驗證二叉搜尋樹
給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。乙個二叉搜尋樹具有如下特徵 示例 1 輸入 2 1 3 輸出 true示例 2 輸入 5 1 4 3 6 輸出 false 解釋 輸入為 5,1,4,null,null,3,6 根節點的值為 5 但是其右子節點值為 4 如果對二叉搜尋樹不夠了解,可能...