LeeCode 实现 Trie (前缀树)

思路:这道题的思路已经写在了题目里,采用Trie树,又称字典树,类似于二叉树,

例如二叉树每个节点有两个子节点,Trie树则有26个子节点,我们的任务就是根据给定的变量

创建一颗树,

例如,apple和app,appc相同的前缀,路径也是相同的

详细的二叉树解释,适合小白看的参考这篇大佬的题解208. 实现 Trie (前缀树) - 力扣(LeetCode)

以下是针对大佬的题解我不懂的地方做出的一些解释

Trie* node = this;,这里为什么要定义一个this,为什么可以这样定义

查了半天资料,总算得出了结论,参考这篇博客C++ this指针详解(精辟) (biancheng.net)

这里的this指的是当前对象的指针,比如

class Student{
public:
    void setname(char *name);
    void setage(int age);
    void setscore(float score);
    void show();
private:
    char *name;
    int age;
    float score;
};

Student s;这里的当前对象就是s。

this是一个指针,指向了s,因为class的特性类似于结构体,this->age直接调用Student的age

另外,this只能在class Student的成员里使用才有效,在其他地方使用是违法的

构造函数 new Trie();

 Trie() {
     isend = false;
     memset(next, 0, sizeof(next));
 }

刚开始不理解这段代码,为什么没有返回值,查了资料才明白,这是一个构造函数,

什么是构造函数?

构造函数是一种特殊的函数,用来在对象实例化的时候初始化对象的成员变量,这里系统的粘贴查到的资料

类(Class)

想象一下,类就像一个蓝图或配方,它描述了一类对象共有的特性和行为。比如,你可以有一个 Car 类,它定义了所有汽车共有的特征(如颜色、品牌、型号)和行为(如启动、加速、刹车)。但是,这个蓝图本身并不是真实的汽车,它只是告诉你如何创建一个汽车对象的规则。

对象实例(Object Instance)

当根据类这个蓝图创建出来的具体实体,我们称之为对象实例。回到 Car 类的例子,如果你根据 Car 类创建了一个特定的汽车(比如一辆红色的特斯拉Model S),这个具体的汽车就是一个对象实例。每个对象实例都有自己的属性值(例如,这辆特斯拉是红色的),但它们都遵循 Car 类定义的结构和功能。

构造函数(Constructor)

构造函数是一个特殊的方法,它的名字和类名相同,没有返回类型。当你创建一个类的新对象时,构造函数会自动被调用。它的主要职责是初始化对象的属性,给对象设置一个初始状态。比如,一个 Car 类的构造函数可能会设置默认的颜色为白色,品牌为未知,直到你创建具体汽车对象时给予明确的值。

回到你的问题

new Trie() 这行代码,可以这样理解:Trie 是一个类,它定义了如何创建一个 Trie 数据结构的节点。当你使用 new 关键字调用 Trie() 时,实际上是按照 Trie 类这个蓝图创建了一个新的、具体的 Trie 节点对象。这个新对象包含了 Trie 类定义的所有特性,比如一个标记是否为单词结尾的布尔值 isend 和一个指向可能的子节点数组 next。这个新创建的对象就是 Trie 数据结构的一部分,用于存储和检索字符串信息。

构造函数的作用主要是完成对象的初始化工作,这里函数的作用是初始化isend,和next数组

new Trie()

当使用 new Trie() 创建一个新的 Trie 对象实例时,实际上就是在内存中为一个新的 Trie 节点分配空间。这个新节点包含了 Trie 类定义的所有数据成员:

这是C++面向对象编程的部分,我也不是很理解,不过明白在这里是这样用的,new Trie()创建了一个新的Trie类,其中的构造函数自动初始化里面的变量isend的值为false,next数组的值为0,等学到这一部分的时候再回来补充

class Trie {
private:bool isend;
       Trie* next[26];

public:
    Trie() {
        isend = false;
        memset(next, 0, sizeof(next));
    }

    void insert(string word) {
        Trie* node = this;
        for (auto c : word)
        {
            if (node->next[c - 'a'] == nullptr)
            {
                node->next[c-'a'] = new Trie();//没错,不用赋值,因为节点本身就是对应的字母
                //创建了一个新的节点,新的class Trie 
            }
            node = node->next[c - 'a'];
        }
        node->isend = true;//结尾节点赋值为true,表明已经走到了一个字符的末尾

    }

    bool search(string word) {
        Trie* node = this;
        for (auto c : word)
        {
            node = node->next[c - 'a'];
            if (node == nullptr)
            {
                return false;
            }
        }
        return node->isend;
    }

    bool startsWith(string prefix) {
        Trie* node = this;
        for (auto c : prefix)
        {
            node = node->next[c - 'a'];
            if (node == nullptr)
            {
                return false;
            }
        }
        return true;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值