程序员面试之必考题:平衡二叉树的基本概念
Posted 开点工作室
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了程序员面试之必考题:平衡二叉树的基本概念相关的知识,希望对你有一定的参考价值。
平衡二叉树是二叉树的一种应用,在介绍平衡二叉树之前,首先来看一看什么是二叉排序树。
二叉排序树
二叉排序树(BST)或者是一棵空树,或者是具有下列性质的二叉树:
①若它的左子树不空,则左子树中所有结点的值均小于树根结点的值;
②若它的右子树不空,则右子树中所有结点的值均大于等于树根结点的值;
③其左、右子树也分别是二叉排序树。
二叉排序树也称为二叉查找树,采用二叉链表结构存储。
由于二叉排序树的有序性,在树中进行查找的效率较高。查找的对象称为查找目标,若找到称为查找成功;否则称为查找失败。
二叉排序树各结点中保存的值称为关键字,有些应用中,要求关键字具有唯一性。
二叉排序树的每棵子树仍是二叉排序树。每个结点的左子结点的值均小于结点本身的值,其右子结点的值均大于等于结点本身的值。这个条件是其必要条件而非充分条件。换句话说,若一棵二叉树中每个结点左子结点的值小于结点的值,其右子结点的值大于等于结点的值,树不一定是二叉排序树。
二叉排序树T中的最小值位于其“左下角”,即从根开始沿指针lchild一直“向下”,直到指针lchild为空的结点。同样的,T中的最大值位于其“右下角”,即从根开始沿指针rchild一直“向下”,直到指针rchild为空的结点。
对二叉排序树进行中序遍历,可得到一个升序序列。这是二叉排序树的特性之一。
对于一般二叉树来说,仅知道树的先序序列或后序序列,不能唯一确定这棵二叉树。但具体到二叉排序树,知道其先序序列或是后序序列,均能唯一确定该树,因为其中序序列是隐含给出的。
二叉排序树的操作主要有:在树中查找关键字key、在树中添加关键字key、删除树中关键字key所在的结点。
2 平衡二叉树
同样的关键字集合可以构建出不同的二叉排序树树形,实际上,关键字的插入次序决定了最终得到的树形。如果给定的初始关键字有序,则得到的二叉排序树退化为线性结构,其树高与结点数相当,查找、插入及删除的时间复杂度均为O(n)。树越退化,查找及添加操作的时间复杂度越接近O(n),消弱了树的价值。
1962年,Adelson-Velskii和E.M.Landis提出了一种二叉树结构,这种二叉树对于各级子树的深度是比较平衡的,称为平衡二叉树,又称AVL树(因三位发现者名字的首字母而得名)。它满足二叉排序树的特性,是对二叉排序树的改进,树形上也是比较平衡的,可以达到较高的查找效率。
平衡二叉树或是一棵空树,或是具有下列性质的二叉排序树:
①它的左子树和右子树的高度之差的绝对值不超过1;
②它的左、右子树都是平衡二叉树。
平衡二叉树的定义是一个递归定义。根据这一定义,平衡二叉树中每个结点的左、右子树的高度之差只能为0、1和-1这三种情况。将结点左、右子树的高度差定义为该结点的平衡因子,即对树中的每个结点,结点的平衡因子=结点左子树高-右子树高。当出现绝对值大于1的平衡因子时,称树失平衡。
在二叉排序树的构建过程中,每插入一个关键字后,检查树的平衡情况,若树失平衡,则通过旋转操作使树恢复平衡。
旋转分为单旋转及双旋转两大类,共4种情况。
(1) 左旋转
因为根的右孩子的右子树上的长路径而失平衡的树,可以通过左旋转恢复,步骤如下:
令根的右孩子变为新的根。
令原根结点变为新根结点的左孩子。
令原根的右孩子的左孩子变为原根结点的新右孩子。
左旋转的示意图如图1所示。
(2) 右旋转
因为根的左孩子的左子树上的长路径而失平衡的树,可以通过右旋转恢复,步骤如下:
令根的左孩子变为新的根。
令原根结点变为新根结点的右孩子。
令原根的左孩子的右孩子变为原根结点的新左孩子。
右旋转类似于左旋转,可以看作是左旋转的镜像。
(3) 右-左旋转
因为根的右孩子的左子树中的长路径而引起的失平衡,必须先绕异常子树执行一次右旋转,然后再绕根执行一次左旋转。这个操作称为右-左旋转。如图2所示。
(4) 左-右旋转
因为根的左孩子的右子树中的长路径而引起的失平衡,必须先绕异常子树执行一次左旋转,然后再绕根执行一次右旋转。这个操作称为左-右旋转。与右-左旋转类似。
以上是关于程序员面试之必考题:平衡二叉树的基本概念的主要内容,如果未能解决你的问题,请参考以下文章