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.
複製代碼
看到此題的入手點就是上方提出的三點二叉搜索樹的三點要求:bash
- 節點的左子樹只包含小於當前節點的數。
- 節點的右子樹只包含大於當前節點的數。
- 全部左子樹和右子樹自身必須也是二叉搜索樹。
1)以上三點要求最容易解決的就是一箇中序遍歷,判斷遍歷出的每一個元素後一個元素是否大於前一個元素,若是不符合條件,那麼就不是一個二分搜索樹。less
1)定義全局的 boolean 變量,用來返回是否爲 二叉搜索樹。ui
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;
};
複製代碼
歡迎一塊兒加入到 LeetCode 開源 Github 倉庫,能夠向 me 提交您其餘語言的代碼。在倉庫上堅持和小夥伴們一塊兒打卡,共同完善咱們的開源小倉庫! Github:https://github.com/luxiangqiang/JS-LeetCode 歡迎關注我我的公衆號:「一個不甘平凡的碼農」,記錄了本身一路自學編程的故事。