算法导论中对二叉树链表中 Delete 函数的实现

上一篇博客中对 Delete 函数的实现是根据被删除节点子节点的子节点个数, 分为无子节点, 一个子节点和两个子节点的情况分别考虑的。

而这次的代码是根据算法导论的实现用 C++ 直译过来的, 代码如下:

void BinarySearchTree::Delete (const int32_t& value)
{
    auto node = Search (value);
    if (node == nullptr) {
        cerr << "There is no such value!\n";
        return;
    }

    PTreeNode successor =
        (node->leftChild == nullptr || node->rightChild == nullptr)
            ? node
            : Successor (node);

    PTreeNode successorChild =
        (successor->rightChild != nullptr)
            ? successor->leftChild
            : successor->rightChild;

    if (successorChild != nullptr){
        successorChild->parent = successor->parent;
    }

    if (successor->parent.expired()) {
        root = successorChild;
    }
    else {
        auto successorParent = successor->parent.lock ();
        if (successor == successorParent->leftChild) {
            successorParent->leftChild = successorChild;
        }
        else {
            successorParent->rightChild = successorChild;
        }
    }

    if (node != successor) {
        node->key = successor->key;
    }
}
时间: 2024-10-11 01:10:40

算法导论中对二叉树链表中 Delete 函数的实现的相关文章

二叉树链表中一个结论的证明以及 Successor() 函数中算法的解释

首先, 先明确 “结点 x 的 successor” 的概念. 这句话的概念是, successor 是整个二叉树中, key 仅比 x 的 key 大的结点. 求证: 若 x 有两个孩子, 那么其 successor 没有左孩子. 证明: 若 x 有两个孩子, 则其右子树存在.在二叉树链表中, 对于任意 x 的右子树都是 key 比 x 的 key 大的结点的集合, 即{y|y->key > x->key}.根据 successor  的定义, 若 x->rightChild ≠

【算法与数据结构】二叉树的 中序 遍历

前一篇写了二叉树的先序遍历,本篇记录一下二叉树的中序遍历,主要是非递归形式的中序遍历. 由于距离上篇有好几天了,所以这里把二叉树的创建和存储结构也重复的写了一遍. 二叉树如下 二叉树的存储方式依然是二叉链表方式,其结构如下 typedef struct _tagBinTree { unsigned char value; struct _tagBinTree* left; struct _tagBinTree* right; }BinTree, *PBinTree; 先序递归形式的创建二叉树代码

【算法导论学习-015】数组中选择第i小元素(Selection in expected linear time)

1.算法思想 问题描述:从数组array中找出第i小的元素(要求array中没有重复元素的情况),这是个经典的"线性时间选择(Selection in expected linear time)"问题. 思路:算法导论215页9.2 Selection in expect linear time 2.java实现 思路:算法导论216页伪代码 /*期望为线性时间的选择算法,输入要求,array中没有重复的元素*/ public static int randomizedSelect(i

C++中 destory() 和deallocate()以及delete函数的相关性和区别性

这里非常的绕口  需要仔细的来看看: destory(): 显示调用一个对象的析构函数 相当于释放一个对象需要释放的一些动态内存 为下次真正释放对象做准备 deallocate():真正的释放一个内存块.这是一个上层封装也就是delete函数的上层封装 在STL的空间配置器中 有可能会调用delete还给OS 也有可能就是放在内存池中 但是对于用户来讲就是释放内存块. 看一个例子 应该就明白了真正的含义了: #include <iostream> #include <stdlib.h&g

STL--C++中 destory() 和deallocate()以及delete函数的相关性和区别性,destorydeallocate

这里非常的绕口  需要仔细的来看看: destory(): 显示调用一个对象的析构函数 相当于释放一个对象需要释放的一些动态内存 为下次真正释放对象做准备 deallocate():真正的释放一个内存块.这是一个上层封装也就是delete函数的上层封装 在STL的空间配置器中 有可能会调用delete还给OS 也有可能就是放在内存池中 但是对于用户来讲就是释放内存块. 看一个例子 应该就明白了真正的含义了: 1 #include <iostream> 2 3 #include <stdl

《算法导论》读书笔记--第三章 函数的增长

好长时间了,继续算法导论. 当输入规模足够大时,并不计算精确的运行时间,倍增常量和低阶项被舍去.我们要研究的是算法的渐近效率,即在输入规模无限量时,在极限中,算法的运行时间如何随着输入规模的变大而增加.通常,渐近的更有效的某个算法除对很小得到输入外都是最好的选择. 3.1渐近符号 用渐近符号来刻画算法的运行时间.

算法导论10:栈链表的简化、队列的数组实现 2016.1.10

新年的前十天做了比较有意义的事情就是坚持每天写博客,明天就开始期末考试了,所以等假期再继续学习. 把昨天提到的S.bottom简化之后又改了栈的链表.代码如下(已折叠): #include<stdio.h> #include<stdlib.h> typedef struct _node{ int num; struct _node *next; }node; node *s; void build(node *&S) { s=(node *)malloc(sizeof(no

《算法导论》读书笔记--第三章函数的增长 课后题

本章的课后题看一下即可,比较平凡. 3.1渐近记号 引用一下别人的答案,非常感谢: 原文地址:http://www.cnblogs.com/timebug/archive/2010/03/25/1694286.html |概念回顾| 当输入规模大到使只有运行时间的增长量级有关时,就使在研究算法的渐进效率. 几个重要渐进记号的定义: Θ(g(n))={ f(n): 存在正常数c1,c2和n0,使对所有的n>=n0,有0<=c1g(n)<=f(n)<=c2g(n) } O(g(n))=

算法导论3.2标准记号和常用函数