设为首页 加入收藏

TOP

算法导论 之 平衡二叉树 - 删除[C语言](三)
2014-11-23 21:12:20 来源: 作者: 【 】 浏览:9
Tags:算法 导论 平衡 删除 语言
rent = node->parent; switch(node->bf) { case LH: /* 左高: 右子树高度减1 树失去平衡 */ { lchild = node->lchild; switch(lchild->bf) { case EH: /* LL型: 向右旋转 */ case LH: /* LL型: 向右旋转 */ { if(EH == lchild->bf) { *lower = false; lchild->bf = RH; node->bf = LH; } else { *lower = true; lchild->bf = EH; node->bf = EH; } avl_set_lchild(node, lchild->rchild); avl_set_rchild(lchild, node); avl_replace_child(tree, parent, node, lchild); break; } case RH: /* LR型: 先向左旋转 再向右旋转 */ { *lower = true; lrchild = lchild->rchild; switch(lrchild->bf) { case LH: { node->bf = RH; lchild->bf = EH; lrchild->bf = EH; break; } case EH: { node->bf = EH; lchild->bf = EH; lrchild->bf = EH; break; } case RH: { node->bf = EH; lchild->bf = LH; lrchild->bf = EH; break; } } avl_set_lchild(node, lrchild->rchild); avl_set_rchild(lchild, lrchild->lchild); avl_set_rchild(lrchild, node); avl_set_lchild(lrchild, lchild); avl_replace_child(tree, parent, node, lrchild); break; } } break; } case EH: /* 等高: 右子树高度减1 树高度不变 */ { node->bf = LH; *lower = false; break; } case RH: /* 右高: 右子树高度减1 树变矮 */ { node->bf = EH; *lower = true; break; } } return AVL_SUCCESS; }

代码5 右子树高度降低后 平衡化处理

/* # 检测节点的指针是否存在异常 # 很有效! */
void avl_assert(avl_node_t *node)
{
    if((NULL == node)
        || (NULL == node->parent)) 
    {
        return;
    }

    if((node->parent->lchild != node)
        && (node->parent->rchild != node)) 
    {
        assert(0);
    }

    if((node->parent == node->lchild)
        || (node->parent == node->rchild))
    {
        assert(0);
    }
}

代码6 节点检测

四、处理结果

左图为原始平衡二叉树,随机删除多个节点后,得到右图。通过观察可知右图依然是一棵平衡二叉树。

\

图1 测试结果


―― 邹祁峰

2013年12月20日 12时

首页 上一页 1 2 3 下一页 尾页 3/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇[算法之道]之字符串逆序输出 下一篇带空格的字符串输入问题

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: