最近面试被问到平衡二叉树的性质及手撕构建平衡二叉树。当时无从下手,翻看牛客网面经,发现是一个常考点。虽然代码量相对较多,但确实是必须要掌握的知识。记录如下:
性质:
1、平衡二叉树其左右子树都为平衡二叉树,且树的深度的绝对值不会超过1;
2、将平衡因子(BF)定义为,其左子树的深度减去右子树的深度,则只会有-1,0,1三种情况;
3、平衡二叉树属于二叉搜索树(BST),也满足二叉搜索树的一些性质:左子树和右子树都是二叉搜索树。左子树所有节点值都小于等于其根节点值,右子树所有节点的值都大于等于其根节点的值;
引出平衡二叉树的原因是想让树的深度尽可能的小,并将查询时间复杂度稳定控制在logn,避免因节点全在树的一边,导致树的深度为n,从而导致的查询时间复杂度为n;
代码实现:
#include<iostream>
#include<stack>
using namespace std;
constexpr auto RH = 1;
constexpr auto EH = 0;
constexpr auto LH = -1;
struct tree {
int val;
int bf;
tree* left;
tree* right;
tree(int n) {
val = n; bf = 0;
left = nullptr; right = nullptr;
}
};
typedef tree* TreeNode;
void R_Roate(TreeNode& P) {
TreeNode L = P->left;
P->left = L->right;
L->right = P;
P = L;
}
void L_Roate(TreeNode& P) {
TreeNode R = P->right;
P->right = R->left;
R->left = P;
P = R;
}
void LeftBalance(TreeNode& T) {
TreeNode L = T->left;
switch(L->bf) {
case LH:
T->bf = L->bf = EH;
R_Roate(T);
break;
case RH:
TreeNode Lr = L->right;
switch (Lr->bf) {
case LH:
T->bf = RH;
Lr->bf = EH;
break;
case EH:
T->bf = Lr->bf = EH;
break;
case