LeetCode解析------2.将二叉搜索树变平衡-二叉搜索树

题目:

给你一棵二叉搜索树,请你返回一棵 平衡后 的二叉搜索树,新生成的树应该与原来的树有着相同的节点值。

如果一棵二叉搜索树中,每个节点的两棵子树高度差不超过 1 ,我们就称这棵二叉搜索树是 平衡的 。

如果有多种构造方法,请你返回任意一种。

示例:

在这里插入图片描述
在这里插入图片描述

输入:root = [1,null,2,null,3,null,4,null,null]
输出:[2,1,3,null,null,null,4]
解释:这不是唯一的正确答案,[3,1,4,null,2,null,null] 也是一个可行的构造方案。

简单介绍:
题目:将二叉搜索树变平衡
题目难度:中等
使用语言:JAVA。
这道题来自leetcode题库的二叉搜索树标签。

解题思路:
首先看题、分析题意,我们可以明确1个关键点:
1.如何把二叉搜索树的点,添加到平衡二叉树上
既然,我们已经分析出来题目的关键任务了,下面我们就可以开始思考实现了。
我们采用算法与数据结构的思路来剖析一下这题,

数据结构:
要实现对数据的操作,我们要先明确存储数据的数据结构。
该题的数据结构的作用:
1.设置一个空链表,保存保存中序遍历的二叉树结果

算法:
既然明确了我们的数据结构,我们就可以开始我们的算法分析了。
1.递归实现中序遍历,结果存入链表。
2.利用链表,从中间开始构建平衡树。

代码部分:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
import java.util.ArrayList;

public class Solution {
    public TreeNode balanceBST(TreeNode root) {
          ArrayList<Integer> list=new ArrayList<>();
        //中序遍历构造链表
        InOrder(root,list);
        //以链表构造平衡树
        return CreateBalanceBST(list,0,list.size()-1);
    }

    //中序遍历构造链表(左子树-》根-》右子树)
    void InOrder(TreeNode root,ArrayList<Integer> list){
        if(root!=null){
            InOrder(root.left,list);
            list.add(root.val);
            InOrder(root.right,list);
        }
    }
   //以链表构造平衡树
    TreeNode CreateBalanceBST(ArrayList<Integer> list,int start,int end){
        if(start>end) return null;
        int mid=start+(end-start>>1);//>>右移运算符,优先级小于 - 。
        TreeNode treeNode=new TreeNode(list.get(mid));
        treeNode.left=CreateBalanceBST(list,start,mid-1);
        treeNode.right=CreateBalanceBST(list,mid+1,end);
        return treeNode;
    }
}

在这里插入图片描述

结语:
晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章