授人以鱼只救一时之急,
授人以渔则可解一生之需.
1. 二叉搜索树
二叉搜索树 (Binary Search Tree),又被称为二叉排序树,二叉查找树。
其特点是:
- 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;
- 若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值;
- 任意节点的左、右子树也分别为二叉搜索树;
二叉搜索树(BST)的中序遍历是递增序列。(PS: 解题常备)
二叉搜索树相比于其他数据结构的优势在于查找、插入的时间复杂度较低。最优是O(log n),最差是O(n)
2. 平衡二叉树
平衡二叉树(Balanced BinaryTree)又被称为AVL树。它具有以下性质:
它是一棵空树或它的左右子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
题目
给你一棵二叉搜索树,请你返回一棵 平衡后 的二叉搜索树.
要想解决这道题,我们首先要具备以下知识:
- 二叉搜索树的性质(中序遍历是递增序列);
- 平衡的定义(左右子树的高度差 <= 1);
- 技能——将有序序列转换为平衡的BST;
代码实现
class Solution {
List<Integer> inorders = new ArrayList<>();
public TreeNode balanceBST(TreeNode root) {
if(root == null){
return null;
}
// 1. 通过中序遍历获得有序序列
inorder(root);
// 2. 构建平衡的二叉搜索树
return buildTree(0,inorders.size()-1);
}
// 根据有序序列构建平衡的二叉搜索树
public TreeNode buildTree(int left,int right){
if(left > right){
return null;
}
int mid = left + (right - left) / 2;
TreeNode root = new TreeNode(inorders.get(mid));
root.left = buildTree(left,mid-1);
root.right = buildTree(mid+1,right);
return root;
}
// 因为中序遍历不是本题的考察点,故这里采用 "递归版本"的中序遍历
public void inorder(TreeNode root){
if(root == null){
return;
}
inorder(root.left);
inorders.add(root.val);
inorder(root.right);
}
}