将有序数组转换为平衡二叉搜索树

来源:互联网 发布:jsp商城系统源码 编辑:程序博客网 时间:2024/04/23 17:23

问题:
给定一个有序数组,数组元素升序排列,试将该数组转换为一棵平衡二叉搜索树(Balanced Binary Search Tree)。

相关概念:
平衡二叉查找树:简称平衡二叉树。由前苏联的数学家Adelse-Velskil和Landis在1962年提出的高度平衡的二叉树,根据科学家的英文名也称为AVL树。它具有如下几个性质:
1. 可以是空树。
2. 假如不是空树,任何一个结点的左子树与右子树都是平衡二叉树,并且高度之差的绝对值不超过1。

平衡之意,如天平,即两边的分量大约相同。如定义,假如一棵树的左右子树的高度之差超过1,如左子树的树高为2,右子树的树高为0,子树树高差的绝对值为2就打破了这个平衡。

平衡因子:左子树的高度减去右子树的高度。由平衡二叉树的定义可知,平衡因子的取值只可能为0,1,-1.分别对应着左右子树等高,左子树比较高,右子树比较高。

package com.h.tree;/** * Created by John on 2017/9/6. */public class TreeNode<T extends Comparable> {    public T data;    public TreeNode left;    public TreeNode right;    public TreeNode(T data, TreeNode left, TreeNode right) {        this.data = data;        this.left = left;        this.right = right;    }    @Override    public String toString() {        return "TreeNode{" +                "data=" + data +                ", left=" + left +                ", right=" + right +                '}';    }}
/**     * 根据一个有序序列构造一棵平衡二叉树     * 思路:先找到根节点,然后递归找到左右子节点(与二分查找类似)     * @param num     * @param start     * @param end     * @return 返回平衡二叉树的根节点     */    public static TreeNode<Integer> sortedArrayToBST(int[] num, int start, int end) {        if (start <= end) {            int mid = (start + end) / 2;            TreeNode<Integer> left = sortedArrayToBST(num, start, mid - 1);            TreeNode<Integer> right = sortedArrayToBST(num, mid + 1, end);            TreeNode<Integer> node = new TreeNode(num[mid],left,right);            node.left = left;            node.right = right;            return node;        }        return null;    }

测试:

package com.h.tree;import java.util.Arrays;/** * Created by John on 2017/9/6. */public class Test {    private static Integer[] data = new Integer[100];    public static void main(String[] args) {        int[] nums = {9,12,14,17,19,23,50,54,67,72,76};        TreeNode<Integer> root = sortedArrayToBST(nums, 0, nums.length - 1);        System.out.println(root);        buildTreeArray(root, 0);        System.out.println(Arrays.toString(data));    }    /**     * 根据一个有序序列构造一棵平衡二叉树     * 思路:先找到根节点,然后递归找到左右子节点(与二分查找类似)     * @param num     * @param start     * @param end     * @return 返回平衡二叉树的根节点     */    public static TreeNode<Integer> sortedArrayToBST(int[] num, int start, int end) {        if (start <= end) {            int mid = (start + end) / 2;            TreeNode<Integer> left = sortedArrayToBST(num, start, mid - 1);            TreeNode<Integer> right = sortedArrayToBST(num, mid + 1, end);            TreeNode<Integer> node = new TreeNode(num[mid],left,right);            node.left = left;            node.right = right;            return node;        }        return null;    }    /**     * 按照从上到下,从左至右的顺序给树节点编号,存放到数组中     * 假设根节点的索引index从0开始,则其左节点和右节点的索引为     * 左孩子:2*(index+1)-1     * 右孩子:2*(index+1)     * @param root     * @param index     */    public static void buildTreeArray(TreeNode<Integer> root,int index){        TreeNode<Integer> left = null;        TreeNode<Integer> right = null;        if (root != null){            data[index] = root.data;            left = root.left;            right = root.right;            if (left != null){                buildTreeArray(left,2*(index+1)-1);            }else {                data[2*(index+1)-1] = null;            }            if (right != null){                buildTreeArray(right,2*(index+1));            }else {                data[2*(index+1)] = null;            }        }    }}    }

打印结果:
这里写图片描述

英文原文:http://articles.leetcode.com/convert-sorted-array-into-balanced

阅读全文
0 0