【随机生成二叉树的问题】

来源:12-2 计算节点的高度和平衡因子

慕移动5238665

2020-05-20

bobo大大大大佬好,这是我自己想的根据数组随机生成一棵二叉树的,思路是先随机打乱数组,然后生成二叉树,但是现在***遇到的问题是二叉树的结构不是随机的***,总是偏向一边,我虽然知道是***if语句出了问题,但是想了好久也不知道怎么改***

public class Solution2 {

	Random random = new Random(System.currentTimeMillis());

	//根据数组随机生成一棵二叉树
	public TreeNode generateTree(int[] array){
		randomArray(array);
		return dfs(array,0);
	}

	private TreeNode dfs(int[] array,int index){
		TreeNode node = new TreeNode(array[index]);
		if(index == array.length -1){
			return node;
		}
		int flag = random.nextInt(2);
		//这里有问题 但是感觉无从下手
		if(flag % 2 == 0){
			node.left = dfs(array,index + 1);
		}else {
			node.right = dfs(array,index +1);
		}
		return node;
	}


	private void randomArray(int[] array){
		//bobo老师的公众号的随机算法
		for(int i = array.length -1; i >= 0; i --){
			swap(array,i,random.nextInt( i +1));
		}
	}

	private void swap(int[] array,int aIndex, int bIndex){
		int c = array[aIndex];
		array[aIndex] = array[bIndex];
		array[bIndex] = c;
	}



}

写回答

1回答

liuyubobobo

2020-05-21

我不确定我是不是正确理解了你的问题,但现在你的代码,每一个节点,或者只是左边有子树,或者只是右边右子树,这是你想要的结果吗?因为你的 dfs 中,或者只对 node.left 进行了赋值;或者只对 node,right 进行了赋值。


一个更好的思路是,随机完整个数组以后,创建一个子函数,根据 array[l...r] 的元素生成一棵随机二叉树。初始根据array[0...n-1] 生成一棵随机二叉树。


每一次,在 [l...r] 区间内随机一个索引 index,当前的节点取 array[index] 的值;

然后,当前节点的左子树根据[l...index-1] 生成随机二叉树;

当前节点的右子树根据[index+1...r] 生成随机二叉树;

依次递归。


试试看?


如果对这类问题不熟悉,可以先尝试解决搞懂 Leetcode 上的 105,106,889,1008 和 297。


加油!:)

1
0

玩转数据结构

动态数组/栈/队列/链表/BST/堆/线段树/Trie/并查集/AVL/红黑树…

6221 学习 · 1704 问题

查看课程