什么是平衡二叉树以及如何检查?

在二叉树的情况下,如果树是倾斜的,它们在执行操作上的计算效率就会变得很低。

这就是确保树木不倾斜背后的动机。因此,需要平衡二叉树。

什么是平衡二叉树

在平衡二叉树上执行操作在计算上是高效的。

平衡二叉树将遵循以下条件:

1.任意结点左右子树的高度绝对差小于1。 2.对于每个节点,其左子树是一棵平衡二叉树。 3.对于每个节点,其右子树是一棵平衡二叉树。

高度平衡二叉树

平衡二叉树也称为高度平衡二叉树。高度平衡二叉树可以表示为HB(K),其中k是左子树和右子树的高度差。‘k’被称为平衡系数。

如果对于一棵树,平衡因子(K)等于零,则该树称为完全平衡二叉树。它可以表示为HB(0)

Full Balanced

自平衡二叉查找树

如果一个二叉搜索树的平衡因子为1,则它是AVL(Adelso-Velskii and Landis) 树。这意味着在AVL树中,左子树和右子树之间的高度差至多为一。

AVL 树是一种自平衡的二叉树。在AVL树中,如果左子树和右子树之间的差异大于1,则它执行以下4个旋转之一来重新平衡自身:

  • 左旋
  • 向右旋转
  • 左右旋转
  • 左右旋转

AVL

如何检查二叉树是否均衡?

要检查二叉树是否平衡,我们需要检查三个条件:

1.任意结点左右子树的高度绝对差应小于1。 2.对于每个节点,其左子树应该是平衡二叉树。 3.对于每个节点,其右子树应该是平衡二叉树。

我们需要一个函数,可以计算树的高度。一种方法是编写一个单独的函数来计算高度,并在每次需要高度时调用它。这在计算上将是低效的。

实现这一点的更好方法是在同一函数中返回Height。

对于每个节点,如果它不是平衡的,我们将返回-1,如果它是平衡的,则返回该节点/子树的高度。

算法如下:

  • If node==NULL->返回0
  • 选中左子树。如果不平衡->返回-1
  • 勾选右子树。如果不平衡->返回-1
  • 左右子树高度之间的绝对值。如果大于1->返回-1。
  • 如果采油树是平衡的->返回高度

伪代码如下所示:

 1private int balanceHeight (TreeNode currentNode)
 2    {
 3        if (currentNode == null)
 4        {
 5            return 0;
 6        }
 7
 8        // checking left subtree
 9        int leftSubtreeHeight = balanceHeight (currentNode.left);
10        if (leftSubtreeHeight == -1) return -1;
11        // if left subtree is not balanced then the entire tree is also not balanced
12
13        //checking right subtree
14        int rightSubtreeHeight = balanceHeight (currentNode.right);
15        if (rightSubtreeHeight == -1) return -1;
16        // if right subtree is not balanced then the entire tree is also not balanced
17
18        //checking the difference of left and right subtree for current node
19        if (Math.abs(leftSubtreeHeight - rightSubtreeHeight) > 1)
20        {
21            return -1;
22        }
23        //if it is balanced then return the height
24        return (Math.max(leftSubtreeHeight, rightSubtreeHeight) + 1);
25    }

您可以在树的根上调用此函数,如果它返回-1以外的任何值,则它是平衡二叉树。如果它返回-1,则它不是平衡二叉树。

总结

在本教程中,我们介绍了平衡二叉树以及如何检查树是否是平衡二叉树。希望你能理解并喜欢和我们一起学习。

Published At
Categories with 技术
comments powered by Disqus