1. 程式人生 > 實用技巧 >將有序陣列轉換為二叉搜尋樹(力扣第108題)

將有序陣列轉換為二叉搜尋樹(力扣第108題)

題目:

將一個按照升序排列的有序陣列,轉換為一棵高度平衡二叉搜尋樹。

本題中,一個高度平衡二叉樹是指一個二叉樹每個節點的左右兩個子樹的高度差的絕對值不超過 1。

示例:

給定有序陣列: [-10,-3,0,5,9],

一個可能的答案是:[0,-3,9,-10,null,5],它可以表示下面這個高度平衡二叉搜尋樹:

      0
     / \
   -3   9
   /   /
 -10  5

分析:

  要求必須是高度平衡的二叉搜尋樹,那麼必須遵循的硬性條件就是:

    1、任何非葉子節點的左右子樹的高度差的絕對值不超過1;

    2、任何非葉子節點的值要大於其左子節點的值,同時小於其右邊子節點的值。

  題目給的是有序陣列,那麼劃分元素的大小的時候就能很好劃分,構建BST的時候採用二分法進行劃分,因為對於一個BST來說,對其進行中序遍歷得到一個結果陣列,排在最中間的元素一定是根節點,對於其中的子樹來說也是同樣的道理。對給的有序陣列進行二分劃分的時候,從第一次劃分開始,第一次取到的中間元素作為根節點,剩餘的左半部分和右半部分分別作為根節點的兩棵子樹,兩個部分對應於有序陣列的[0,mid)和(mid,length-1],然後根據陣列的這兩個部分分別再次對兩棵子樹進行二分法劃分構建BST子樹。

  因為採用的是二分法劃分有序陣列,每次經過劃分,左右部分的元素數量最多相差一個,那麼也就意味著所有非葉子節點的左右子樹的節點數量最多相差一個,那麼就能保證從上往下構造BST樹的時候,所有非葉子節點的左右子樹的高度差的絕對值至多為1。

程式碼:

    public TreeNode sortedArrayToBST(int[] nums) {

        if ( nums == null || nums.length == 0 ){
            return null;
        }

        return createBST(nums,0,nums.length - 1 );
    }

    private TreeNode createBST(int[] nums,int left,int right ){

        if ( left > right ){
            
return null; } int mid = (left - right) / 2 + right; TreeNode rootNode = new TreeNode(nums[mid]); rootNode.left = createBST(nums,left,mid - 1); rootNode.right = createBST(nums,mid + 1,right); return rootNode; }