【LeetCode】 98 驗證二叉搜尋樹
阿新 • • 發佈:2018-11-29
解題思路:
1 二叉搜尋樹和中序遍歷有著密不可分的關係,中序遍歷的結果是所有樹中的節點從左到右的排列。如上圖示例2中的樹 中序遍歷結果應是15346
2 基於1,我們易知,如果中序遍歷的結果是升序排列的,那麼此樹符合二叉搜尋樹的要求,所以可以用中序遍歷並檢測檢測結果的升序情況來做。
3 更快速的演算法是:通過定義來做,對每個節點設定一個最大值和最小值,判斷完了之後將左右子樹分別遞迴呼叫此方法。
程式碼(中序遍歷):
class Solution { public boolean isValidBST(TreeNode root) { // List<Integer> vals = new ArrayList<>(); Stack<TreeNode> treeNodes = new Stack<>(); TreeNode nowNode = root; int pre = Integer.MIN_VALUE; boolean flag = true; do{ while (nowNode != null){ treeNodes.push(nowNode); nowNode = nowNode.left; } if (!treeNodes.empty()){ nowNode = treeNodes.pop(); if (flag){ flag = false; } else if (nowNode.val <= pre) return false; pre = nowNode.val; nowNode = nowNode.right; } }while (nowNode != null || !treeNodes.empty()); return true; } }
程式碼(定義+遞迴):
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public boolean isValidBST(TreeNode root) { if (root == null) return true; return valid(root, Long.MIN_VALUE, Long.MAX_VALUE); } public boolean valid(TreeNode root, long low, long high) { if (root == null) return true; if (root.val <= low || root.val >= high) return false; return valid(root.left, low, root.val) && valid(root.right, root.val, high); } }