【劍指Offer】二叉樹——二叉查找樹

package cn.dzp.flyroc.offer;

import java.util.Arrays;

public class VerifySquenceOfBSTDemo {

    /*題目描述:輸入一個整數數組,判斷該數組是否是某二叉搜索樹的後序遍歷的結果。
    若是是則輸出YES,不然輸出NO,假設輸入的數組的任意兩個數字都互不相同*/

    /*思路:在後序遍歷的結果中,最後一個元素爲根節點;
    從根節點開始掃描這個序列,比根節點小的,在左半部分;
    比根節點大的,在右半部分。根據這樣的劃分,把序列劃分爲左右兩部分,
    咱們遞歸地確認序列的左、右兩部分是否是都是二元查找樹。*/


    /*實現步驟:
     * 1、判讀數組是否爲空,長度是否爲0
     * 2、定義數組的長度,定義根節點的位置(數組中最後一個元素),定義一個標記
     * 3、判斷左子樹是否是小於根節點的值
     * 4、判斷右子樹是否是大於根節點的值
     * 5、遞歸遍歷左右子樹*/


    //代碼實現

    public class TreeNode{       //定義TreeNode
        int val;
        TreeNode left;
        TreeNode right;

        TreeNode(int val){

            this.val = val;
        }
    }


    public static boolean verifySquenceOfBST(int[] arr){

        //判斷數組是否爲空,長度是否爲0
        if (arr == null || arr.length == 0){

            System.out.println("NO");
            return false;
        }

        int leng = arr.length;        //定義數組的長度
        int root = arr[leng - 1];       //定義根節點
        boolean flag = false;       //定義標記

        //判斷左子樹是否是小於根節點的值
        int i;
        for (i = 0; i < leng-1; i++){

            if (arr[i] < root){

                flag = true;

            }else {

                break;
            }
        }

        //判斷右子樹是否大於根節點
        for (int j = i; j < leng-1; j++){

            if (arr[j] > root){

                System.out.println("YES");
                flag = true;
                return flag;

            }else {

                flag = false;
                return flag;
            }
        }



        //遞歸遍歷左右子樹
        boolean left = true;
        if (i > 0){         //判斷左子樹是否成立

            left = verifySquenceOfBST(Arrays.copyOfRange(arr,0, i));
        }


        boolean right = true;
        if (i < leng-1){            //判斷右子樹是否成立

            right = verifySquenceOfBST(Arrays.copyOfRange(arr, i ,leng -1));
        }

        boolean result = left && right;
        return result;

    }

}
相關文章
相關標籤/搜索