二叉树链表的实现: Insert()

之前我的思路是, 先用一个指针找到合适的位置, 再通过指针把值传进去……然后就陷入多重指针的深渊里了。

后来我的解决方法是递归:

class BinarySearchTree
{
private:
    // do something...

    PTreeNode MakeNewNode (const int32_t& value)
    {
        auto newNode       = make_shared<TreeNode> ();
        newNode->key       = value;
        return move(newNode);
    }

    void InsertIter (PTreeNode& node, const int32_t& value)
    {
        if (node == nullptr) {
            node = MakeNewNode (value);
        }
        else {
            if (node->key < value) {
                InsertIter (node->rightNode, value);
            }
            else {
                InsertIter (node->leftNode, value);
            }
        }
    }
public:
    void Insert (const int32_t& value)
    {
        InsertIter (root, value);
    }

    // other functions...
};

后来在知乎看到了 @坡下碎石 的解答, 深受启发, 有了迭代版本:

struct TreeNode
{

    int32_t              key = 0;
    PTreeNode            leftNode = nullptr;
    PTreeNode            rightNode = nullptr;

    PTreeNode& MoveToNextNode(const int32_t& value)
    {
        return key < value ? rightNode : leftNode;
    }
};

class BinarySearchTree
{
private:
    PTreeNode   root;

    PTreeNode MakeNewNode(const int32_t& value)
    {
        auto newNode = std::make_shared<TreeNode>();
        newNode->key = value;
        return newNode;
    }

public:
    void Insert(const int32_t& value)
    {
        if (root == nullptr)
        {
            root = MakeNewNode(value);
        }
        else
        {
            PTreeNode current = root;
            while (true)
            {
                PTreeNode& p = current->MoveToNextNode(value);
                if (p == nullptr)
                {
                    p = MakeNewNode(value);
                    break;
                }
                current = p;
            }
        }
    }
};
时间: 2024-11-06 19:53:45

二叉树链表的实现: Insert()的相关文章

c之二叉树链表操作---建立、(递归)前序遍历、中序遍历、后序遍历

[二叉树链表] 1.节点定义: typedef struct node{ int data; struct node*lchild,*rchild; }Tree,*BiTree; 2.创建二叉树: BiTree creat_Tree(BiTree root,int num){//建立二叉树 if(root==NULL) { root=(Tree *)malloc(sizeof(Tree)); if(root==NULL) { printf("no memory available\n"

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

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

(eden)排序二叉树VS二叉树链表

排序二叉树 Description: If you have any doubt on this assignment, please send an email to its author 黎洋. --> 题目大意:请完成下面四个函数的定义(在tree.h文件中),使整个程序能够利用排序二叉树的结构对输入的数(不会出现相同的数),进行排序输出.节点的结构体在下面已给出,这个二叉树的特征是,左子数的值肯定比父节点小,右子树的值肯定比父节点的大.要求大家按照这个结构特征去构建二叉树,最后中序遍历输

(链表) lintcode 219. Insert Node in Sorted Linked List

Description Insert a node in a sorted linked list. Example Example 1: Input: head = 1->4->6->8->null, val = 5 Output: 1->4->5->6->8->null Example 2: Input: head = 1->null, val = 2 Output: 1->2->null---------------------

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

上一篇博客中对 Delete 函数的实现是根据被删除节点子节点的子节点个数, 分为无子节点, 一个子节点和两个子节点的情况分别考虑的. 而这次的代码是根据算法导论的实现用 C++ 直译过来的, 代码如下: void BinarySearchTree::Delete (const int32_t& value) { auto node = Search (value); if (node == nullptr) { cerr << "There is no such value

深入浅出数据结构C语言版(12)——从二分查找到二叉树

在很多有关数据结构和算法的书籍或文章中,作者往往是介绍完了什么是树后就直入主题的谈什么是二叉树balabala的.但我今天决定不按这个套路来.我个人觉得,一个东西或者说一种技术存在总该有一定的道理,不是能解决某个问题,就是能改善解决某个问题的效率.如果能够先了解到存在的问题以及已存在的解决办法的不足,那么学习新的知识就更容易接受,也更容易理解. 万幸的是,二叉树的讲解是可以按照上述顺序来进行的.那么,今天在我们讨论二叉树之前,我们先来讨论一种情形.一种操作:假设现在有一个数组,数组中的数据按照某

数据结构-树与二叉树

一.树的定义与性质 <1>定义 结点(node):树枝分叉处.树叶.树根 根结点(root):树根 叶子结点(leaf):叶子结点 边(edge):茎干和树枝 子结点(child) 子树(subtree) <2>性质 树可以没有结点,把这种情况下称为空树(empty tree) 树的层次(layer),从根结点开始算起来,即根结点为第一层 把结点的子树棵树称为结点的度(degree),而树的中结点的最大的度称为树的度(也称为树的宽度) 对于有n个结点的树的边一定是n-1 叶子结点被

二叉树的存储表示与实现

二叉树的顺序存储 完全二叉树的存储可以按照从上到下,从左到右的顺序依次存储在一维数组中.完全二叉树的顺序存储如图所示:               如果按照从上到下,从左到右的顺序把非完全二叉树也同样的编号,将结点依次存放在一维数组中,为了能够正确反映二叉树中结点之间的逻辑关系,需要在一维数组中将二叉树中不存在的结点位置空出. 顺序存储对于完全二叉树来说是比较适合的,因为采用顺序存储能够节省内存单元,并能够利用公式得到每个结点的存储位置.但是,对于非完全二叉树来说,这种存储方式会浪费内存空间.

Java数据结构和算法之链表

三.链表 链结点 在链表中,每个数据项都被包含在'点"中,一个点是某个类的对象,这个类可认叫做LINK.因为一个链表中有许多类似的链结点,所以有必要用一个不同于链表的类来表达链结点.每个LINK对象中都包含一个对下一个点引用的字段(通常叫做next)但是本身的对象中有一个字段指向对第一个链结点的引用. 单链表 用一组地址任意的存储单元存放线性表中的数据元素. 以元素(数据元素的映象)  + 指针(指示后继元素存储位置)  = 结点(表示数据元素 或 数据元素的映象) 以"结点的序列&q