vlambda博客
学习文章列表

【每日编程-96期】 最大二叉树

今日问题:

给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下:

  1. 二叉树的根是数组中的最大元素。

  2. 左子树是通过数组中最大值左边部分构造出的最大二叉树。

  3. 右子树是通过数组中最大值右边部分构造出的最大二叉树。

通过给定的数组构建最大二叉树,并且输出这个树的根节点。

Example 1:

输入:[3,2,1,6,0,5]

输入:返回下面这棵树的根节点:

注意:

  1. 给定的数组的大小在 [1, 1000] 之间。


解决方法:

非递归:

1.从左至右依次扫描数组,建立新的树节点。

2.使用一个栈来维护一个递减序列(一部分结点而非所有)

3.遍历每个数字,如果栈非空或者它比栈顶数字大则将它入栈;如果最大的数(存在的话),则它一定在栈中,它是当前数字的根,而上一个出栈的数字(存在的话)是当前数字的左孩子(暂时的,可能改变),然后我们将当前数字入栈。

C++代码:

【每日编程-96期】 最大二叉树


递归:

【每日编程-96期】 最大二叉树


C代码:

【每日编程-96期】 最大二叉树

Java代码:

【每日编程-96期】 最大二叉树




明日题目预告:

另一个树的子树

给定两个非空二叉树  t,检验 中是否包含和 具有相同结构和节点值的子树。s 的一个子树包括 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。

示例 1:

【每日编程-96期】 最大二叉树

返回 true,因为 t s 的一个子树拥有相同的结构和节点值。

示例 2:

返回 false