使用有序数组构建高度最低的BST
发布日期:2021-05-07 22:02:49 浏览次数:17 分类:精选文章

本文共 2029 字,大约阅读时间需要 6 分钟。

1. 问题描述:

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

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

树节点的定义如下:

public class TreeNode
{ public T val; public TreeNode
left = null; public TreeNode
right = null; public TreeNode
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
root) { if(root == null){ return; } System.out.print(root.val + " "); preOrder(root.left); preOrder(root.right); } //中序遍历 private static void midOrder(TreeNode
root) { if(root == null){ return; } midOrder(root.left); System.out.print(root.val + " "); midOrder(root.right); } //后序遍历 private static void lastOrder(TreeNode
root) { if(root == null){ return; } lastOrder(root.left); lastOrder(root.right); System.out.print(root.val + " "); } private static TreeNode
createMinBST(int[] arr, int start, int end) { if(start > end) return null; int mid = (start + end) >> 1; TreeNode
left = createMinBST(arr, start, mid - 1); TreeNode
right = createMinBST(arr, mid + 1, end); TreeNode
res = new TreeNode
(arr[mid]); res.left = left; res.right = right; return res; }}

 

上一篇:BST中某一层的所有节点(宽度优先搜索)
下一篇:路径数字串之和

发表评论

最新留言

感谢大佬
[***.8.128.20]2025年03月18日 11时49分42秒