題目:
給你一棵二叉搜索樹,請你返回一棵 平衡後 的二叉搜索樹,新生成的樹應該與原來的樹有着相同的節點值。
如果一棵二叉搜索樹中,每個節點的兩棵子樹高度差不超過 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;
}
}
結語:
晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!