zoukankan      html  css  js  c++  java
  • Validate Binary Search Tree 解答

    Question

    Given a binary tree, determine if it is a valid binary search tree (BST).

    Assume a BST is defined as follows:

    • The left subtree of a node contains only nodes with keys less than the node's key.
    • The right subtree of a node contains only nodes with keys greater than the node's key.
    • Both the left and right subtrees must also be binary search trees.

    Solution 1 -- Recursive

    According to the question, we can write recursive statements. Note here whole left/right subtree should be smaller/greater than the root.

     1 /**
     2  * Definition for a binary tree node.
     3  * public class TreeNode {
     4  *     int val;
     5  *     TreeNode left;
     6  *     TreeNode right;
     7  *     TreeNode(int x) { val = x; }
     8  * }
     9  */
    10 public class Solution {
    11     public boolean isValidBST(TreeNode root) {
    12         if (root == null)
    13             return true;
    14         if (root.left != null && !smallerThanRoot(root, root.left))
    15             return false;
    16         if (root.right != null && !greaterThanRoot(root, root.right))
    17             return false;
    18         if (isValidBST(root.left) && isValidBST(root.right))
    19             return true;
    20         return false;
    21     }
    22     
    23     private boolean greaterThanRoot(TreeNode root, TreeNode child) {
    24         if (child.val <= root.val)
    25             return false;
    26         if (child.left != null) {
    27             if (!greaterThanRoot(root, child.left))
    28                 return false;
    29         }
    30         if (child.right != null) {
    31             if (!greaterThanRoot(root, child.right))
    32                 return false;
    33         }
    34         return true;
    35     }
    36     
    37     private boolean smallerThanRoot(TreeNode root, TreeNode child) {
    38         if (child.val >= root.val)
    39             return false;
    40         if (child.left != null) {
    41             if (!smallerThanRoot(root, child.left))
    42                 return false;
    43         }
    44         if (child.right != null) {
    45             if (!smallerThanRoot(root, child.right))
    46                 return false;
    47         }
    48         return true;
    49     }
    50 }

    Solution 2 -- Inorder Traversal

    Inorder traversal of BST is an ascending array. Java Stack

     1 /**
     2  * Definition for a binary tree node.
     3  * public class TreeNode {
     4  *     int val;
     5  *     TreeNode left;
     6  *     TreeNode right;
     7  *     TreeNode(int x) { val = x; }
     8  * }
     9  */
    10 public class Solution {
    11     public boolean isValidBST(TreeNode root) {
    12         // This problem can be looked as inorder traversal problem
    13         // Inorder traversal of BST is an ascending array
    14         List<Integer> inOrderResult = new ArrayList<Integer>();
    15         Stack<TreeNode> stack = new Stack<TreeNode>();
    16         TreeNode tmp = root;
    17         while (tmp != null || !stack.empty()) {
    18             if (tmp != null) {
    19                 stack.push(tmp);
    20                 tmp = tmp.left;
    21             } else {
    22                 TreeNode current = stack.pop();
    23                 inOrderResult.add(current.val);
    24                 tmp = current.right;
    25             }
    26         }
    27         // Traverse list
    28         if (inOrderResult.size() < 1)
    29             return true;
    30         int max = inOrderResult.get(0);
    31         for (int i = 1; i < inOrderResult.size(); i++) {
    32             if (inOrderResult.get(i) > max)
    33                 max = inOrderResult.get(i);
    34             else
    35                 return false;
    36         }
    37         return true;
    38     }
    39 }
  • 相关阅读:
    Shell高级编程学习笔记(基础篇)
    基于Python的机器学习实战:Apriori
    基于Python的机器学习实战:AadBoost
    Theano教程:Python的内存管理
    基于theano的降噪自动编码器(Denoising Autoencoders--DA)
    基于theano的深度卷积神经网络
    推荐系统之矩阵分解及C++实现
    推荐系统之协同过滤的原理及C++实现
    一步一步详解ID3和C4.5的C++实现
    Principal components analysis(PCA):主元分析
  • 原文地址:https://www.cnblogs.com/ireneyanglan/p/4845433.html
Copyright © 2011-2022 走看看