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;
    }
}

在這裏插入圖片描述

結語:
晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!

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