排序數組轉變爲平衡二叉樹

原題

  Given an array where elements are sorted in ascending order, convert it to a height balanced BST.java

題目大意

  給定一個升序排列的二叉樹,將其轉換爲一棵高度平衡的二叉樹。算法

解題思路

  採用遞歸分治法。數組

代碼實現

樹結點類函數

public class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) { val = x; }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

算法實現類this

public class Solution {

    public TreeNode sortedArrayToBST(int[] nums) {
        // 參數檢驗
        if (nums == null || nums.length < 1) {
            return null;
        }

        // 遞歸分治法求解
        return solve(nums, 0, nums.length - 1);
    }

    /**
     * 遞歸分治求解方法
     *
     * @param nums  升序排序數組
     * @param start 開始位置
     * @param end   結束位置
     * @return 根結點
     */
    public TreeNode solve(int[] nums, int start, int end) {
        // 還有未處理的數據
        if (start <= end) {
            // 找蹭位置
            int mid = start + ((end - start) >> 1);
            // 構造根結點
            TreeNode root = new TreeNode(nums[mid]);
            // 求左子樹
            root.left = solve(nums, start, mid - 1);
            // 求右子樹
            root.right = solve(nums, mid + 1, end);
            // 返回結果
            return root;
        }

        return null;
    }
}

 

 

題目spa

給一個已排序的數組,將其轉化爲一顆平衡二叉樹。.net

平衡二叉樹要求左右子樹的高度差不超過1。咱們把排序數組的中間節點做爲根,可保證左右子樹的元素個數差不超過1,則確定是平衡二叉樹。這個很好理解,很少解釋了。利用遞歸能夠很容易的解決。使用遞歸的一個要點是,必定要相信咱們的遞歸函數會返回正確的結果,只要處理好返回條件,代碼就很簡單了。code

例如:排序

01 Input:  Array {1, 2, 3}
02 Output: A Balanced BST
03      2
04    /  \
05   1    3
06  
07 Input: Array {1, 2, 3, 4}
08 Output: A Balanced BST
09       3
10     /  \
11    2    4
12  /
13 1

下面是java的實現:遞歸

01 public class SortedArrayToBST {
02  
03     public static Tree SortedArrayToBST(int arr[], int s, int e) {
04         //返回條件
05         if (s > e)
06             return null;
07         int mid = (s + e) / 2;
08         //把中間節點做爲根
09         Tree root = new Tree(arr[mid]);
10         //分別遞歸左右子樹
11         root.left = SortedArrayToBST(arr, s, mid - 1);
12         root.right = SortedArrayToBST(arr, mid + 1, e);
13         return root;
14     }
15  
16     //二叉樹類
17     static class Tree {
18         public Tree left, right;
19         public int data;
20  
21         public Tree(int d) {
22             data = d;
23         }
24  
25         //中序遍歷
26         public void inOrder() {
27             if (this.left != null)
28                 this.left.inOrder();
29             System.out.print(data + " ");
30             if (this.right != null)
31                 this.right.inOrder();
32         }
33  
34         //先序遍歷
35         public void preOrder() {
36             System.out.print(data + " ");
37             if (this.left != null)
38                 this.left.preOrder();
39             if (this.right != null)
40                 this.right.preOrder();
41         }
42     }
43  
44     public static void main(String[] args) {
45         int arr[] = { 1, 2, 3, 4, 5, 6, 7 };
46         Tree tree = SortedArrayToBST(arr, 0, arr.length - 1);
47         tree.inOrder();
48         System.out.println();
49         tree.preOrder();
50     }
51

}

相關文章
相關標籤/搜索