题解39 | 具有误导性的next指针#二叉树的下一个结点#

二叉树的下一个结点

https://www.nowcoder.com/practice/9023a0c988684a53960365b889ceaf5e

/*
struct TreeLinkNode {
    int val;
    struct TreeLinkNode *left;
    struct TreeLinkNode *right;
    struct TreeLinkNode *next;
    TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) {
        
    }
};
*/
#include <cstddef>//nullptr
/*"#include <cstddef>" 是一个C++标准库头文件,用于包含一些与指针和内存相关的类型和函数。
"cstddef" 是 "C Standard Definitions" 的缩写,意为C标准定义。它定义了一些与C语言兼容的常用宏和类型,这些宏和类型通常在C++中使用。
这个头文件中包含的一些常用类型有:
- size_t:用于表示对象的大小或数组的长度的无符号整数类型。
- ptrdiff_t:用于表示指针之间的差值的有符号整数类型。
- nullptr_t:表示空指针常量的特殊类型。
- max_align_t:表示对象的最大对齐要求的类型。
此外,该头文件还定义了一些与指针和内存相关的函数,如:
- offsetof:用于获取结构体成员的偏移量。
- alignof:用于获取类型的对齐要求。
通过包含这个头文件,可以在C++程序中使用这些类型和函数,以方便地进行指针和内存操作。*/
#include <vector>
class Solution {
public:
    vector<TreeLinkNode*> res;
    void dfs(TreeLinkNode *root){
        if(root == NULL) return ;

        dfs(root->left);
        res.push_back(root);
        dfs(root->right);
    }
    TreeLinkNode* GetNext(TreeLinkNode* pNode) {
        TreeLinkNode *root = pNode;
        //注意,树中的结点不仅包含左右子结点,同时包含指向父结点的next指针。
        //传入的是子树根,我们要先找着总根
        //不过我觉得叫pre指针更好,叫next有误导性
        while (root->next) {
            root = root->next;
        }

        dfs(root);

        int n = res.size();

        for (int i = 0; i < n; i++) {
            TreeLinkNode *now = res[i];
            if(pNode == now){
                return res[i+1];
            }
        }

        return NULL;
    }
};

基本算法思想

通过深度优先搜索(DFS)遍历整个树,将遍历的结果存储在一个vector中。然后在vector中找到给定节点的下一个节点。

具体步骤如下:

1. 定义一个vector<TreeLinkNode*> res,用于存储遍历的结果。

2. 实现一个递归的深度优先搜索函数dfs,遍历树的过程中将每个节点存入res中。

3. 在GetNext函数中,先找到整个树的根节点,即通过不断向上遍历节点的next指针,直到找到最顶层的根节点。

4. 调用dfs函数对整个树进行遍历,将遍历结果存入res中。

5. 获取res的大小n,遍历res,找到给定节点pNode在res中的位置i,返回res[i+1]作为给定节点的下一个节点。

时间复杂度:

- 遍历整个树的时间复杂度为O(N),其中N是树中节点的数量。

- 获取给定节点的下一个节点的时间复杂度为O(N),需要遍历res找到给定节点的位置。

空间复杂度:

- 使用了一个额外的vector<TreeLinkNode*> res,存储了整个树的遍历结果,所以空间复杂度为O(N),其中N是树中节点的数量。

2024考研数据结构 文章被收录于专栏

本人考研刷算法题,立此专栏练习强化。

全部评论

相关推荐

昨天 13:42
门头沟学院 Java
运气爆棚福星高赵:清✌️不用很在意项目,八股算法是重点,八股算法说的过去绝对要您
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务