根據陣列建立平衡二叉搜尋樹
阿新 • • 發佈:2018-12-19
它是一 棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉(搜尋)樹。
二分:用有序陣列中中間的數生成搜尋二叉樹的頭節點,然後對陣列的左右部分分別生成左右子樹即可(重複過程)。
生成的二叉樹中序遍歷一定還是這個序列。
非常簡單,不過多敘述:
public class SortedArrayToBalancedBST { public static class Node { public int value; public Node left; public Node right; public Node(int data) { this.value = data; } } public static Node generateTree(int[] sortArr) { if (sortArr == null) { return null; } return generate(sortArr, 0, sortArr.length - 1); } public static Node generate(int[] sortArr, int start, int end) { if (start > end) { return null; } int mid = (start + end) / 2; Node head = new Node(sortArr[mid]); head.left = generate(sortArr, start, mid - 1); head.right = generate(sortArr, mid + 1, end); return head; } // for test -- print tree public static void printTree(Node head) { System.out.println("Binary Tree:"); printInOrder(head, 0, "H", 17); System.out.println(); } public static void printInOrder(Node head, int height, String to, int len) { if (head == null) { return; } printInOrder(head.right, height + 1, "v", len); String val = to + head.value + to; int lenM = val.length(); int lenL = (len - lenM) / 2; int lenR = len - lenM - lenL; val = getSpace(lenL) + val + getSpace(lenR); System.out.println(getSpace(height * len) + val); printInOrder(head.left, height + 1, "^", len); } public static String getSpace(int num) { String space = " "; StringBuffer buf = new StringBuffer(""); for (int i = 0; i < num; i++) { buf.append(space); } return buf.toString(); } public static void main(String[] args) { int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; printTree(generateTree(arr)); } }