leetcode 98 驗證二叉搜索樹

題目以下java

給定一個二叉樹,判斷其是不是一個有效的二叉搜索樹。

假設一個二叉搜索樹具備以下特徵:

節點的左子樹只包含小於當前節點的數。
節點的右子樹只包含大於當前節點的數。
全部左子樹和右子樹自身必須也是二叉搜索樹。
示例 1:

輸入:
    2
   / \
  1   3
輸出: true
示例 2:

輸入:
    5
   / \
  1   4
     / \
    3   6
輸出: false
解釋: 輸入爲: [5,1,4,null,null,3,6]。
     根節點的值爲 5 ,可是其右子節點值爲 4

題解

  1. 直接使用二叉樹的中序遍歷獲取一個數組,查看該數組是否爲嚴格遞增
    代碼以下
# Definition for a binary tree node.
class TreeNode(object):
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

class Solution(object):
    def isValidBST(self, root):
        """ :type root: TreeNode :rtype: bool """
        ansList = self.helper(root)
        for i in range(len(ansList)-1):
            if (ansList[i] >= ansList[i+1]):
                return False
        return True

    def helper(self, root):
        if root == None:
            return []
        else:
            return self.helper(root.left) + [root.val] + self.helper(root.right)
  1. 採用遞歸加上最大值最小值思想,當查看右節點時,最小值爲該節點的值,若右節點的值比本節點的值還要小;或者查看左節點時,最大值爲該節點的值,若左節點的值大於本節點的最大值。這樣兩種狀況會返回false,
    代碼以下
public class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) { val = x; }
}

class Solution {
    public boolean isValidBST(TreeNode root) {
        return helper(root, Long.MIN_VALUE, Long.MAX_VALUE);
    }
    public boolean helper(TreeNode root, Long min, Long max) {
        if (root == null) {
            return true;
        } 
        if ((root.val <= min) || (root.val >= max)) {
            return false;
        }
        return helper(root.left, min, (long) root.val) && helper(root.right, (long) root.val, max);
    }
}
相關文章
相關標籤/搜索