驗證二叉搜尋樹
阿新 • • 發佈:2020-11-03
問題描述
給定一個二叉樹,判斷其是否是一個有效的二叉搜尋樹。
假設一個二叉搜尋樹具有如下特徵:節點的左子樹只包含小於當前節點的數;節點的右子樹只包含大於當前節點的數;所有左子樹和右子樹自身必須也是二叉搜尋樹。
示例 1:
輸入:
2
/ \
1 3
輸出: true
示例 2:
輸入:
5
/ \
1 4
/ \
3 6
輸出: false
解釋: 輸入為: [5,1,4,null,null,3,6]。
根節點的值為 5 ,但是其右子節點值為 4 。
解法一(遞迴):
看到這題我的第一反應肯定是遞迴:
public boolean isValidBST(TreeNode root) {//定義三個節點中、左、右 return isValidBST(root, Long.MIN_VALUE, Long.MAX_VALUE); } public boolean isValidBST(TreeNode root, long minVal, long maxVal) { if (root == null) return true; //不滿足條件直接false if (root.val >= maxVal || root.val <= minVal) return false; //遞迴下一層 return isValidBST(root.left, minVal, root.val) && isValidBST(root.right, root.val, maxVal); }
解法二(遞迴):
//定義一個前驅節點 TreeNode prev; //中序遍歷思想 public boolean isValidBST2(TreeNode root) { if (root == null) return true; //遍歷左子樹if (!isValidBST2(root.left)) return false; if (prev != null && prev.val >= root.val) return false; prev = root; //遍歷右子樹 if (!isValidBST2(root.right)) return false; return true; }
解法三(迭代):
public boolean isValidBST1(TreeNode root) { //迭代的中序遍歷 if (root == null)return true; Stack<TreeNode> stack =new Stack<>(); TreeNode pre = null; while (root != null||!stack.isEmpty()){ while (root!=null){ stack.add(root); root=root.left; } root=stack.pop(); if (pre != null && prev.val >= root.val) return false; pre = root; root = root.right; } return true; }
總結:
這題掌握中序遍歷就很好做了,左子樹小於根節點,右子樹大於根節點。