结点的删除向来是二叉树的操作中的难点,平衡二叉树中结点删除相对更是复杂,由于删除结点操作以后还要保持其平衡的特征,
所以给我们删除的操作带来了一些小麻烦!
之前的文章我写过一个关于AVL树的结点插入的操作,当时我在二叉树结点的定义中加入了一个height的参数,这个参数表示以该
结点为根的子树的深度。在本文中我将这个参数删掉,利用一个方法Depth(),来求该结点的深度!如果读者有兴趣,自己把这个参数的操作
加进去,难度不会很大,逻辑对了就OK。 虽然因此效率低了不少,不过难度降低了不少!
好依然首先把结点结构定义打出来:
typedef int ElemType;
typedef struct Node
{
ElemType data;
struct Node * lchild;
struct Node * rchild;
}avlNode,*avlTree;
删除结点的操作依然需要分几种情况来分析:
1、假如要删除的结点是一片叶子,即叶子结点:
那么直接删除这个结点,然后从它的父节点开始判断结点被删除以后是否依然满足平衡的特性,利用递归一直判断到根结点为止,
利用递归很容易解决。
2、非叶子结点的删除&