1. 程式人生 > >[leetcode]二叉搜尋樹&平衡二叉樹

[leetcode]二叉搜尋樹&平衡二叉樹

1.二叉搜尋樹 BST
概念:
①所有非葉子節點至多擁有兩個兒子
②所有節點儲存一個關鍵字
非葉子節點的左指標指向小於其關鍵字的子樹,右指標指向大於其關鍵字的子樹
④二叉搜尋樹的中序遍歷是不遞減的

題目描述:
Given a binary tree, determine if it is a valid binary search tree (BST).

思路:
根據④可得,可中序遍歷該樹,看是否不遞減的,若不滿足,則不是二叉搜尋樹

程式碼:

public class Solution {
    TreeNode pre=null;
    public boolean isValidBST(TreeNode root) {
        if(root!=null){
            if(!isValidBST(root.left)){
                return false;
            }
            if(pre!=null&&root.val<=pre.val){
                return false;
            }
            pre=root;
            return isValidBST(root.right);
        }
        return true;
    }
}

2.平衡二叉搜尋樹
概念:平衡二叉搜尋樹,其是一棵空樹或其左右子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。

題目描述:
Given a binary tree, determine if it is height-balanced.
For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of every node never differ by more than 1.

思路:
遍歷到一個節點時,檢查其左子樹和右子樹的高度差是否滿足平衡二叉搜尋樹的性質,若滿足再去遞迴檢查其左子樹和右子樹是否滿足。

程式碼:

public class Solution {
    public boolean isBalanced(TreeNode root) {
        if(root==null){
            return true;
        }
        int height1=getHeight(root.left);
        int height2=getHeight(root.right);
        if((height1-height2)>=-1&&(height1-height2)<=1){
            return true&&isBalanced(root.left)&&isBalanced(root.right);
        }
        else{
            return false;
        }
    }
    
    public int getHeight(TreeNode root){
        if(root==null){
            return 0;
        }
        if(root.left==null&&root.right==null){
            return 1;
        }
        else{
            int height=1+Math.max(getHeight(root.left),getHeight(root.right));
            return height;
        }
    }
     
}