【每日编程-96期】 最大二叉树
今日问题:
给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下:
二叉树的根是数组中的最大元素。
左子树是通过数组中最大值左边部分构造出的最大二叉树。
右子树是通过数组中最大值右边部分构造出的最大二叉树。
通过给定的数组构建最大二叉树,并且输出这个树的根节点。
Example 1:
输入:[3,2,1,6,0,5]
输入:返回下面这棵树的根节点:
注意:
给定的数组的大小在 [1, 1000] 之间。
解决方法:
非递归:
1.从左至右依次扫描数组,建立新的树节点。
2.使用一个栈来维护一个递减序列(一部分结点而非所有)
3.遍历每个数字,如果栈非空或者它比栈顶数字大则将它入栈;如果最大的数(存在的话),则它一定在栈中,它是当前数字的根,而上一个出栈的数字(存在的话)是当前数字的左孩子(暂时的,可能改变),然后我们将当前数字入栈。
C++代码:
递归:
C代码:
Java代码:
明日题目预告:
另一个树的子树
给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。
示例 1:
返回 true,因为 t 与 s 的一个子树拥有相同的结构和节点值。
示例 2:
返回 false。