平衡二叉树构建及递归和非递归遍历树实现(c++)

最近面试被问到平衡二叉树的性质及手撕构建平衡二叉树。当时无从下手,翻看牛客网面经,发现是一个常考点。虽然代码量相对较多,但确实是必须要掌握的知识。记录如下:

性质:
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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值