构造数组的MaxTree

要求:给定一个无序的,无重复元素的数组,生成MaxTree,要求每一个根节点处为当前最大值

           时间复杂度要求O(n),空间复杂度O(n)

思路:一开始第一个想法是排序,在生成二叉排序树之类的,堆排序递归之类的,但是题目要求了时间复杂度为O(n),这些方 法都超了。但是题目没有要求生成的MaxTree一定为完全二叉树之类的,只要符合根节点最大,所以,我们可以自己规定MaxTree的特点。(书上P23页开始),证明了除全局最大的根节点有两个子树,其他根节点全是单边的。最后生成的树感觉是只有两条腿。。。。。

e.g.[3,4,5,1,2]

           5

         /   \

     4       2

  /        /

3        1

这样就会出现一个规则,一个节点的位置与它在数组中左右相邻的最大值有关。具体见书23页。。。。

※※※  关于记录两边的相邻最大值。可以用stack结构辅助。例如【3,1,2】,首先压入3,再看1,比3小,继续压入。再看2,比1大,说明2的左侧相邻最大值在1的下面,首先记录map(1,3),说明1的左侧最大值确定了是3,记录好之后弹出1,剩下3,3比2大,OK,直接压入2。 最后栈中的顺序为【3,2】,再依次pop出来,生成map对。

public TreeNode getMaxTree(int[] 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值