使用有序数组构建高度最低的BST

1. 问题描述:

Given a sorted(increasing order) array, write an algorithm to create a binary search tree with mininal height;

给出一个上升序列的数组,使用一种算法来构建一颗具有最小高度的树

树节点的定义如下:

public class TreeNode<T> {
   public T val;
   public TreeNode<T> left = null;
   public TreeNode<T> right = null;
   public TreeNode<T> parent = null;
   public TreeNode(T val) {
     this.val = val;
   }
   
	@Override
	public String toString() {
		return "TreeNode [val=" + val + "]";
	}
	
}

下面以中序遍历为例来进行构建,在中序遍历中以谁作为根对于同样的序列那么构建出来的树都是不一样的,所以对应的树的高度也是不一样的,要想使得树的高度最小那么应该使树的两边的节点尽可能分布均匀,那么我们可以采用首尾相加相除的方式来得到当前的根节点(中间节点)是谁,取得中间节点之后之后那么以中间为界限分为了左右两个区间,对于左右两个区间我们又可以使用同样的方式来进行处理,那么这个时候我们可以使用递归的方式来进行解决即可

构建出整棵树之后我们得到了整棵树的根节点,这个时候可以使用中序遍历进行输出,也可以使用前序遍历和后序遍历进行检验来查看构建的树是否正确

代码如下:

public class BSTWithMinHeight {
	//左右两边进行递归即可
	@SuppressWarnings("unchecked")
	public static void main(String[] args) {
		int arr[] = {1, 2, 3, 4, 5, 6, 7};    
		/*int arr[] = {1, 7, 4, 3, 5, 2, 6};*/
		TreeNode root = createMinBST(arr, 0, arr.length - 1);
		preOrder(root);
		System.out.print("\n");
		midOrder(root);
		System.out.print("\n");
		lastOrder(root);
	}

	//前序遍历
	private static void preOrder(TreeNode<Integer> root) {
		if(root == null){
			return;
		}
		System.out.print(root.val + " ");
		preOrder(root.left);
		preOrder(root.right);
	}
	
	//中序遍历
	private static void midOrder(TreeNode<Integer> root) {
		if(root == null){
			return;
		}
		midOrder(root.left);
		System.out.print(root.val + " ");
		midOrder(root.right);
	}

	//后序遍历
	private static void lastOrder(TreeNode<Integer> root) {
		if(root == null){
			return;
		}
		lastOrder(root.left);
		lastOrder(root.right);
		System.out.print(root.val + " ");
	}
	
	private static TreeNode<Integer> createMinBST(int[] arr, int start, int end) {
		if(start > end) return null;
		int mid = (start + end) >> 1;
		TreeNode<Integer> left = createMinBST(arr, start, mid - 1);
		TreeNode<Integer> right = createMinBST(arr, mid + 1, end);
		TreeNode<Integer> res = new TreeNode<Integer>(arr[mid]);
		res.left = left;
		res.right = right;
		return res;
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值