一、题目
给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下:
1、二叉树的根是数组中的最大元素。
2、左子树是通过数组中最大值左边部分构造出的最大二叉树。
3、右子树是通过数组中最大值右边部分构造出的最大二叉树。
通过给定的数组构建最大二叉树,并且输出这个树的根节点。1
示例 :
二、思路
一开始的想法就是直接递归
1、先找到这一堆数中的最大值,然后创建节点,并和相应的父节点相连
2、接下来把最大值左侧的值和右侧的值切开分别返回左子树,右子树
然后重复1、2得到结果
最后,抱歉,我太菜了,没有递归出来,按道理应该是可以的,如果那年那月我想不开了也许会再试试递归的做法。目前来看应该可行,但未证实。
实际的做法:非递归,使用栈解决问题
1、直接从获得的数组从左往右创建右子树,前提是子节点一直都比父节点大
2、出现将要创建的子节点的值比父节点大这种情况的时候,栈的作用就出来了,开始回溯,一直往上,直到找到合适的节点
3、找到合适的节点之后就把改节点原来的右子树变为左子树,将要新建的节点作为右子树
其中栈的作用:存储当前节点的父节点们,一直弹栈的话是可以得到根节点的,每一个节点在创建之后都会进栈,回溯的时候进行弹栈
注意点:
1、循环的时候指针的位置
2、交换节点的时候注意别迷了,我就是因为交换节点的时候迷了,3行代码改了1个多小时
三、代码
import java.util.ArrayList;
public class T0654 {
public static void main(String[] args) {
//int nums[] = {3, 2, 1, 6, 0, 5};
int nums[] = {2,7,0,1,11,2,4,1,5,3,12,0,6,8,3,2};
ZHONGGEN( constructMaximumBinaryTree(nums) );
System.out.println();
XIANGEN( constructMaximumBinaryTree(nums) );
}
public static TreeNode constructMaximumBinaryTree(int[] nums) {
TreeNode root = new TreeNode( nums[0] );
TreeNode parent = root;
//用于查询上一个结点
ArrayList<TreeNode> heap = new ArrayList<>();
int index = 0;
for( int i = 1; i < nums.length; i++ ){
//将上一次循环创建的节点压入栈中
heap.add(parent);
index++;
//判断当前的值是不是比父节点大,小就直接进行创建,大就进行else
if( parent.val > nums[i] ){
parent.right = new TreeNode( nums[i] );
parent = parent.right;
}else{
//弹栈,寻找合适的节点,注意判断栈内是不是空了
while( heap.size() > 0 && heap.get( index-1 ).val < nums[i] ){
heap.remove( index-1 );
index--;
}
TreeNode temp = new TreeNode(nums[i] );
//如果栈空了的话就代表当前树中所有的值都没接下来的这个大,就把这个值创建成根节点,原来的树变为左子树
if( heap.size() == 0 ){
temp.left = root;
root = temp;
parent = root;
//没空就进行交换,得到结果
}else{
temp.left = heap.get( heap.size()-1 ).right;
heap.get( heap.size()-1 ).right = temp;
parent = temp;
}
}
}
return root;
}
//输出栈内的值
public static void pt(ArrayList<TreeNode> heap){
for ( int i = 0; i < heap.size(); i++ ){
System.out.print( heap.get(i).val + "\t" );
}
System.out.println();
}
//中根遍历,递归算法
public static void ZHONGGEN(TreeNode root){
if( root != null ){
ZHONGGEN( root.left );
System.out.print( root.val + "\t");
ZHONGGEN( root.right );
}
}
//先根遍历,递归算法
public static void XIANGEN(TreeNode root){
if( root != null ){
System.out.print( root.val + "\t");
XIANGEN( root.left );
XIANGEN( root.right );
}
}
}
//Definition for a binary tree node.
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-binary-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 ↩︎