平衡二叉树和二叉排序树

二叉排序树,简单而言就是左子树上所有节点的值均小于根节点的值,而右子树上所有结点的值均大于根节点的值,左小右大,并不是乱序,因此得名二叉排序树。

平衡二叉树是在二叉排序树的基础上发展而来的。平衡二叉树,又称AVL树,指的是左子树上的所有节点的值都比根节点的值小,而右子树上的所有节点的值都比根节点的值大,且左子树与右子树的高度差最大为1。因此,平衡二叉树满足所有二叉排序(搜索)树的性质。

有了二叉排序树就可以使插入、搜索效率大大提高了,为什么还要引入平衡二叉树?  二叉搜索树的结构与值的插入顺序有关,同一组数,若其元素的插入顺序不同,二叉搜索树的结构是千差万别的。举个例子,给出一组数[1,3,5,8,9,13]。  若按照[5,1,3,9,13,8]这样的顺序插入,其流程是这样的:  

若按照[1,3,5,8,9,13]这样的顺序插入,其流程是这样的:

如果在上面的二叉搜索树中查找13,是要将所有节点都遍历一遍的,时间复杂度就变成了O(n),几乎就是一个链表。  细心的朋友可能已经发现,插入的序列越接近有序,生成的二叉搜索树就越像一个链表。  为了避免二叉搜索树变成“链表”,我们引入了平衡二叉树,即让树的结构看起来尽量“均匀”,左右子树的节点数尽量一样多。

判断二叉树是否是平衡二叉树

首先构建一个新的函数求树的最大深度,然后求左子树最大深度,右子树最大深度,两者之差大于1就return false,然后菜判断左右子树是不是分别依旧是高度平衡树,结束。

你可能感兴趣的:(平衡二叉树和二叉排序树)