先序遍历应用

举报
Linux猿 发表于 2022/02/27 22:46:53 2022/02/27
【摘要】 🎈 作者:Linux猿🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊!🎈 关注专栏: 数据结构和算法成神路【精讲】优质好文持续更新中……🚀🚀🚀🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬 二叉树一般使用链表进行存储,下面就来看一道二叉树转换为单链表的题目。一、题目描述给定二叉树的根结点 ro...


🎈 作者:Linux猿

🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊!

🎈 关注专栏: 数据结构和算法成神路【精讲】优质好文持续更新中……🚀🚀🚀

🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬 


二叉树一般使用链表进行存储,下面就来看一道二叉树转换为单链表的题目。

一、题目描述

给定二叉树的根结点 root ,请将它展开为一个单链表,展开规则如下所示:

(1)展开后的单链表应该同样使用 TreeNode;

(2)right 子指针指向链表中下一个结点,而左子指针始终为 null;

(3)展开后的单链表应该与二叉树先序遍历顺序相同。

提示:

树中结点数在范围 [0, 2000] 内

-100 <= Node.val <= 100

二、测试样例

图1 二叉树展开图

输入:root = [1,2,5,3,4,null,6]

输出:[1,null,2,null,3,null,4,null,5,null,6]

在上图中,二叉树展开后的单链表是先序遍历的顺序,注意:别忘记将节点的左指针赋值为空。

三、算法思路

本题主要考查先序遍历,在先序遍历过程中,将右指针指向下一个先序遍历节点,左子树访问完成后,将左指针赋值为空,一直到先序遍历完成。

四、代码实现

代码如下所示:

#include <iostream>

using namespace std;


struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode() : val(0), left(nullptr), right(nullptr) {}
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
    TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};

class Solution {
public:
    void flatten(TreeNode* root) {
        if(!root) return;
        if(!root->left && !root->right) return;

        TreeNode* right = root->right;

        if(root->left) { // left 
            root->right = root->left;
            flatten(root->left);

            TreeNode* tmp = root;
            while(tmp->right) {
                tmp = tmp->right;
            }
            tmp->right = right;
        } else {
            root->right = right;
        }
        
        root->left = nullptr;
        flatten(right);
    }
};

int main()
{
    cout << "Hello world!" << endl;
    return 0;
}

图2 通过截图 

 

五、复杂度分析

5.1 时间复杂度

时间复杂度:O(n),其中,n 为二叉树节点个数,在上述算法中,需要访问二叉树所有节点,所以时间复杂度为 O(n)。

5.2 空间复杂度

空间复杂度:O(n),其中,n 为二叉树节点个数,在上述算法中,递归访问过程中会使用栈进行存储,最大的空间复杂度为单支的二叉树,所以空间复杂度为 O(n)。

六、总结

本题主要在于先序遍历算法,先序遍历过程中转换指针的指向即可,注意:需要先访问过左子树的情况下,才将左指针赋值为空。


🎈 感觉有帮助记得「一键三连支持下哦!有问题可在评论区留言💬,感谢大家的一路支持!🤞猿哥将持续输出「优质文章回馈大家!🤞🌹🌹🌹🌹🌹🌹🤞



🎈 作者:Linux猿

🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊!

🎈 关注专栏: 数据结构和算法成神路【精讲】优质好文持续更新中……🚀🚀🚀

🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬 


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。