平衡二叉树求解步骤:
(1)插入节点
(2)找出不平衡因子,在插入过程中找到不平衡因子
(3)旋转,根据不平衡因子判断旋转方式
(4)生成新的平衡二叉树
在求解过程中,最重要步骤详解:
找出不平衡因子(也就是左右子树的高度差值为2或-2的情况)
方法1步骤:
a.节点中添加两个属性,左子树高度、右子树高度。
b.插入节点
c.返回的过程中动态的计算插入节点过程中经过的节点的左子树或右子树的高度。并计算各个节点的因子.
d.当节点因子为0时,返回过程中停止计算树的高度。当节点因子为2或-2时,即为不平衡因子,进行旋转
e.所有的旋转分为四种类型:LL顺时针旋转, RR逆时针旋转, LR先逆时针、然后顺时针,RL先顺时针在逆时针,旋转过程中调整各个节点的左右子树高度
f.旋转完成周调整,父节点的对应的左子树或者右子树的高度
这个方法通过给节点添加左右子树高度属性的方法,优点:节点的左右子树,只需要管理自己的高度,分而自治减少复杂性。代码中实现的是这个方法
(1)插入节点
(2)找出不平衡因子,在插入过程中找到不平衡因子
(3)旋转,根据不平衡因子判断旋转方式
(4)生成新的平衡二叉树
在求解过程中,最重要步骤详解:
找出不平衡因子(也就是左右子树的高度差值为2或-2的情况)
方法1步骤:
a.节点中添加两个属性,左子树高度、右子树高度。
b.插入节点
c.返回的过程中动态的计算插入节点过程中经过的节点的左子树或右子树的高度。并计算各个节点的因子.
d.当节点因子为0时,返回过程中停止计算树的高度。当节点因子为2或-2时,即为不平衡因子,进行旋转
e.所有的旋转分为四种类型:LL顺时针旋转, RR逆时针旋转, LR先逆时针、然后顺时针,RL先顺时针在逆时针,旋转过程中调整各个节点的左右子树高度
f.旋转完成周调整,父节点的对应的左子树或者右子树的高度
这个方法通过给节点添加左右子树高度属性的方法,优点:节点的左右子树,只需要管理自己的高度,分而自治减少复杂性。代码中实现的是这个方法
package ProductCosume;
import java.util.Queue;
import java.util.Stack;
public class BinaryTreeTest {
enum BalanceFactory {
LeftFactory(1), RightFactory(-1), EqualFacotry(0), LeftLossBalanceFactory(
2), RightLossBalanceFactory(-2), InvalideFactory(-3);
int value = 0;
private BalanceFactory(int value) {
this.value = value;
}
}
// 节点
static class Node {
public Node(int value) {
key = value;
}
int key;
private BalanceFactory af = BalanceFactory.EqualFacotry;
Node leftNode = null;
Node rightNode = null;
Node parentNode = null;
int leftNodeHeight = 0;
int rightNodeHeight = 0;
public int getNodeHeight() {
return leftNodeHeight > rightNodeHeight ? leftNodeHeight
: ri