将有序数组转换为平衡二叉搜索树
来源:互联网 发布: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
- 将有序数组转换为平衡二叉搜索树
- 将有序数组转换为平衡二叉搜索树
- 将有序单链表转换为平衡的二叉搜索树
- 有序数组转换为平衡二叉搜索树
- 有序数组转换为平衡二叉树
- 有序数组转换为平衡二叉搜索树(Convert Sorted Array to Binary Search Tree)
- 108. Convert Sorted Array to Binary Search Tree 有序数组转换为平衡二叉搜索树
- 有序单向链表转换为平衡搜索二叉树
- 有序数组转换为平衡二叉树(BST)
- 数组——将排序数组转换为平衡二叉搜索树
- 算法:有序数组转为平衡的二叉搜索树
- 通过有序数组生成平衡搜索二叉树
- 将有序数组转化为二叉树
- 将有序单链表转化为平衡二叉树
- 将有序数组转变成平衡二叉查找树
- 有序链表转换为平衡二叉树(BST)
- LeetCode | Convert Sorted Array to Binary Search Tree(有序数组转换成平衡二叉树搜索树)
- 将有序表转化为二叉搜索树
- java.util.concurrent介绍
- windows server 2003 serial key windows2003 sp2可用序列号大全(准版与企业版)
- leetcode148套题
- Caffe杂记(1)
- HDU 4771
- 将有序数组转换为平衡二叉搜索树
- Linux程序编译、链接、运行中的.o .a .so .ko .la文件
- 小谈 python 生成器
- python与c++的混合调用
- 前端学习笔记之4 静态页面练习(百度)
- Msys2安装tumx,发现msys2比cygwin好用多了
- MySQL练习笔记
- UnityShader从入门到放弃(三)将法线的颜色填充给物体
- Opencv中的copyMakeBorder和borderInterpolate以及getRectSubPix函数讲解