Time:2019/4/24
Title: Vaildata Binary Search Tree
Difficulty: Medium
Author: 小鹿javascript
Given a binary tree, determine if it is a valid binary search tree (BST).java
Assume a BST is defined as follows:node
給定一個二叉樹,判斷其是不是一個有效的二叉搜索樹。git
假設一個二叉搜索樹具備以下特徵:github
- 節點的左子樹只包含小於當前節點的數。
- 節點的右子樹只包含大於當前節點的數。
- 全部左子樹和右子樹自身必須也是二叉搜索樹。
Example 1:算法
Input: 2 / \ 1 3 Output: true
Example 2:編程
5 / \ 1 4 / \ 3 6 Output: false Explanation: The input is: [5,1,4,null,null,3,6]. The root node's value is 5 but its right child's value is 4.
看到此題的入手點就是上方提出的三點二叉搜索樹的三點要求:less
- 節點的左子樹只包含小於當前節點的數。
- 節點的右子樹只包含大於當前節點的數。
- 全部左子樹和右子樹自身必須也是二叉搜索樹。
1)以上三點要求最容易解決的就是一箇中序遍歷,判斷遍歷出的每一個元素後一個元素是否大於前一個元素,若是不符合條件,那麼就不是一個二分搜索樹。code
1)定義全局的 boolean 變量,用來返回是否爲 二叉搜索樹。2)定義一個邊界值賦予 max 變量。每遍歷一次,若是符合先後大小的要求,就將當前節點的值賦值給 max 變量,用於下一次遍歷的結點的大小比較。若是不符合要求,咱們將其布爾變量置爲 false。遞歸
3)整個過程是用遞歸來解決的,在理解上仍是有點不符合常規思路的。也是整個問題分析中最重要的一點。
var isValidBST = function(root) { // boolean 變量 let isValidBSTFlag = true; // 最大值變量 let max = -Number.MAX_VALUE; const orderSearch = root => { // 終止條件(判斷當前結點是否爲 null) if (root) { // 中序遍歷 orderSearch(root.left); // 判斷遍歷先後的值是否逐漸升序 if (root.val > max) { // 存儲當前結點值,進行下一次比較 max = root.val; } else { // 當前節點值小於前一結點值,返回 false isValidBSTFlag = false; } orderSearch(root.right); } } orderSearch(root); return isValidBSTFlag; };