刷題95—樹(二)

142題—148題

知識點:

  1. 二叉搜索樹:一棵空樹或者左子樹小於根節點,右子樹大於根節點的樹
  2. 先序遍歷:根節點->左子樹->右子樹
  3. 中序遍歷:左子樹->根節點->右子樹
  4. 後序遍歷:左子樹->右子樹->根節點

142.合法二叉搜索樹

題目連接

來源:力扣(LeetCode)
連接:https://leetcode-cn.com/problems/legal-binary-search-tree-lcci
著做權歸領釦網絡全部。商業轉載請聯繫官方受權,非商業轉載請註明出處。javascript

題目描述

實現一個函數,檢查一棵二叉樹是否爲二叉搜索樹。css

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

題目分析

  1. 二叉搜索樹:一棵空樹或者左子樹小於根節點,右子樹大於根節點的樹;
  2. 中序遍歷:先遍歷左子樹再遍歷根節點再遍歷右子樹;
  3. 二叉搜索樹使用中序遍歷的結果是嚴格遞增的,若不是,則不是二叉搜索樹。
/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @return {boolean}
 */
var isValidBST = function(root) {
    let max = -Infinity;
    if(!root) return true;
    function check(root){
        if(!root) return true;
        if(check(root.left)){
            if(max < root.val){
                max = root.val;
                //console.log(max);
                return check(root.right);
            }
        }
        return false;
    }
    return check(root);
};

143.後繼者

題目連接

來源:力扣(LeetCode)
連接:https://leetcode-cn.com/problems/successor-lcci
著做權歸領釦網絡全部。商業轉載請聯繫官方受權,非商業轉載請註明出處。node

題目描述

設計一個算法,找出二叉搜索樹中指定節點的「下一個」節點(也即中序後繼)。算法

若是指定節點沒有對應的「下一個」節點,則返回null。數組

示例 1:網絡

輸入: root = [2,1,3], p = 1數據結構

2
/ \
1 3函數

輸出: 2
示例 2:this

輸入: root = [5,3,6,2,4,null,null,1], p = 6

5
/ \
3 6
/ \
2 4
/
1

輸出: null

題目分析

  1. 二叉搜索樹:一棵空樹或者左子樹小於根節點,右子樹大於根節點的樹;
  2. 中序遍歷:先遍歷左子樹再遍歷根節點再遍歷右子樹;
  3. 對於每顆樹的根節點,p大於根節點,解在右子樹;
  4. p小於根節點,解在左子樹,如果不在,根節點就是解;
  5. p等於根節點,解在右子樹,最小節點就是解,如果沒找到,返回null。
/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @param {TreeNode} p
 * @return {TreeNode}
 */
var inorderSuccessor = function(root, p) {
    if(!root) return null;
    if(p.val > root.val) return inorderSuccessor(root.right,p);
    else if(p.val === root.val){
        let node = root.right;
        while(node && node.left){
            node = node.left;
        }
        return node;    
    }else{
        return inorderSuccessor(root.left,p) || root;
    }
};

  

 

144.首個共同祖先

 

題目連接

來源:力扣(LeetCode)
連接:https://leetcode-cn.com/problems/first-common-ancestor-lcci
著做權歸領釦網絡全部。商業轉載請聯繫官方受權,非商業轉載請註明出處。

題目描述

設計並實現一個算法,找出二叉樹中某兩個節點的第一個共同祖先。不得將其餘的節點存儲在另外的數據結構中。注意:這不必定是二叉搜索樹。

例如,給定以下二叉樹: root = [3,5,1,6,2,0,8,null,null,7,4]

3
/ \
5 1
/ \ / \
6 2 0 8
/ \
7 4
示例 1:
輸入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
輸入: 3
解釋: 節點 5 和節點 1 的最近公共祖先是節點 3。
示例 2:
輸入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
輸出: 5
解釋: 節點 5 和節點 4 的最近公共祖先是節點 5。由於根據定義最近公共祖先節點能夠爲節點自己。
說明:
全部節點的值都是惟一的。
p、q 爲不一樣節點且均存在於給定的二叉樹中。

題目分析

  1. 判斷二叉樹是否爲空,若爲空,return null;
  2. 判斷p節點或q節點是否是根節點,如果根節點,返回根節點;
  3. 判斷p節點或q節點是否是分別在根節點左右子樹上,如果,返回根節點;
  4. 判斷p節點或q節點是否是在根節點的同一側,是的話,返回left或right;
/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @param {TreeNode} p
 * @param {TreeNode} q
 * @return {TreeNode}
 */
var lowestCommonAncestor = function(root, p, q) {
    if(!root) return null;
    if(root.val == p.val || root.val == q.val) return root;
    let left = lowestCommonAncestor(root.left,p,q);
    let right = lowestCommonAncestor(root.right,p,q);
    if(left && right) return root;
    else return left || right;
};

145.二叉搜索樹的最小絕對差

題目連接

來源:力扣(LeetCode)
連接:https://leetcode-cn.com/problems/minimum-absolute-difference-in-bst
著做權歸領釦網絡全部。商業轉載請聯繫官方受權,非商業轉載請註明出處。

題目描述

給你一棵全部節點爲非負值的二叉搜索樹,請你計算樹中任意兩節點的差的絕對值的最小值。

 

示例:

輸入:

1
\
3
/
2

輸出:
1

解釋:
最小絕對差爲 1,其中 2 和 1 的差的絕對值爲 1(或者 2 和 3)。
 

提示:

樹中至少有 2 個節點。
本題與 783 https://leetcode-cn.com/problems/minimum-distance-between-bst-nodes/ 相同

題目分析

  1. 二叉搜索樹:一棵空樹或者左子樹小於根節點,右子樹大於根節點的樹;
  2. 中序遍歷:先遍歷左子樹再遍歷根節點再遍歷右子樹;
  3. 把二叉搜索樹經過中序遍歷後存放在arr數組中;
  4. 遍歷arr數組,比較數組中兩兩的差值,找出最小的差值。
/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number}
 */
var getMinimumDifference = function(root) {
    if(!root) return null;
    let arr = [];
    let min;
    order(root,arr);
    for(let i=0; i<arr.length-1; i++){
        if(min){
            if(Math.abs(arr[i+1] - arr[i]) < min)
                min = Math.abs(arr[i+1] - arr[i]);
        }else{
            min = Math.abs(arr[i+1] - arr[i]);
        }
    }

    function order(root,arr){
        if(root){
            order(root.left,arr);
            arr.push(root.val)
            order(root.right,arr);
        } 
    }
    return min;
};

  

146.二叉搜索樹節點最小距離

 

題目連接

來源:力扣(LeetCode)
連接:https://leetcode-cn.com/problems/minimum-distance-between-bst-nodes
著做權歸領釦網絡全部。商業轉載請聯繫官方受權,非商業轉載請註明出處。

題目描述

給定一個二叉搜索樹的根節點 root,返回樹中任意兩節點的差的最小值。

 

示例:

輸入: root = [4,2,6,1,3,null,null]
輸出: 1
解釋:
注意,root是樹節點對象(TreeNode object),而不是數組。

給定的樹 [4,2,6,1,3,null,null] 可表示爲下圖:

4
/ \
2 6
/ \
1 3

最小的差值是 1, 它是節點1和節點2的差值, 也是節點3和節點2的差值。
 

注意:

二叉樹的大小範圍在 2 到 100。
二叉樹老是有效的,每一個節點的值都是整數,且不重複。
本題與 530:https://leetcode-cn.com/problems/minimum-absolute-difference-in-bst/ 相同

題目分析

與上一題相同

/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number}
 */
var minDiffInBST = function(root) {
    if(!root) return null;
    let arr = [];
    order(root,arr);
    let min;
    for(let i=0; i<arr.length-1; i++){
        if(min){
            if(Math.abs(arr[i+1] - arr[i]) < min){
                min = Math.abs(arr[i+1] - arr[i]);
            }
        }else{
                min = Math.abs(arr[i+1] - arr[i]);
            }
    }
    
    function order(root,arr){
        if(root){
            order(root.left,arr);
            arr.push(root.val);
            order(root.right,arr);

        }
    }
    return min;
};

  

147.把二叉搜索樹轉換爲累加樹

題目連接

來源:力扣(LeetCode)
連接:https://leetcode-cn.com/problems/convert-bst-to-greater-tree
著做權歸領釦網絡全部。商業轉載請聯繫官方受權,非商業轉載請註明出處。

題目描述

給定一個二叉搜索樹(Binary Search Tree),把它轉換成爲累加樹(Greater Tree),使得每一個節點的值是原來的節點值加上全部大於它的節點值之和。

 

例如:

輸入: 原始二叉搜索樹:
5
/ \
2 13

輸出: 轉換爲累加樹:
18
/ \
20 13
 

注意:本題和 1038: https://leetcode-cn.com/problems/binary-search-tree-to-greater-sum-tree/ 相同

題目分析

  1. 二叉搜索樹:一棵空樹或者左子樹小於根節點,右子樹大於根節點的樹;
  2. 所以,右子樹不用改變,左子樹須要加上右子樹和根節點,根節點須要加上右子樹;
  3. 遞歸遍歷右子樹,把右子樹的值加到根節點上,把改變後的根節點的值加到左子樹上。
/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @return {TreeNode}
 */
var convertBST = function(root) {
    if(!root) return null;
    let sum = 0;
    function add(root){
        if(root){
            add(root.right);
            sum += root.val;
            root.val = sum;
            add(root.left);
        }
    }
    add(root);
    return root;
};

148.從二叉搜索樹到更大和樹

題目連接

來源:力扣(LeetCode)
連接:https://leetcode-cn.com/problems/binary-search-tree-to-greater-sum-tree
著做權歸領釦網絡全部。商業轉載請聯繫官方受權,非商業轉載請註明出處。

題目描述

給出二叉 搜索 樹的根節點,該二叉樹的節點值各不相同,修改二叉樹,使每一個節點 node 的新值等於原樹中大於或等於 node.val 的值之和。

提醒一下,二叉搜索樹知足下列約束條件:

節點的左子樹僅包含鍵 小於 節點鍵的節點。
節點的右子樹僅包含鍵 大於 節點鍵的節點。
左右子樹也必須是二叉搜索樹。
 

示例:

 

輸入:[4,1,6,0,2,5,7,null,null,null,3,null,null,null,8]
輸出:[30,36,21,36,35,26,15,null,null,null,33,null,null,null,8]
 

提示:

樹中的節點數介於 1 和 100 之間。
每一個節點的值介於 0 和 100 之間。
給定的樹爲二叉搜索樹。
 

注意:該題目與 538: https://leetcode-cn.com/problems/convert-bst-to-greater-tree/  相同

題目分析

與上一題相同

/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @return {TreeNode}
 */
var bstToGst = function(root) {
    if(!root) return null;
    let sum = 0;
    add(root);
    function add(root){
        if(root){
            add(root.right);
            sum += root.val;
            root.val = sum;
            add(root.left);
        }
        return root;
    }
    return root;
};
相關文章
相關標籤/搜索