题654、最大二叉树

一、题目

给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下:
       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;
    }
}


  1. 来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/maximum-binary-tree
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 ↩︎

发布了25 篇原创文章 · 获赞 0 · 访问量 110

猜你喜欢

转载自blog.csdn.net/weixin_45980031/article/details/103466266
今日推荐