当前位置: 首页 > article >正文

LeetCode Hot100 | Day5 | 二叉树右视图二叉树展开为链表

LeetCode Hot100 | Day5 | 二叉树右视图&&二叉树展开为链表

文章目录

  • LeetCode Hot100 | Day5 | 二叉树右视图&&二叉树展开为链表
    • 199.二叉树的右视图
      • 1.递归遍历
      • 2.层序遍历
    • 114.二叉树展开为链表

199.二叉树的右视图

199. 二叉树的右视图 - 力扣(LeetCode)

完整代码:

1.递归遍历

来自于灵神的题解,我仅仅是看懂

遍历顺序:
中右左,因为收集的是右视图,我们要收集最右边的,先递归右子树,保证首次遇到的一定是最右边的,有人可能会好奇,这样的话,遍历左子树的时候会有不符合条件的答案进去,深度就是解决这个问题的

关键点:

深度首次遇到才会记录答案,这样避免了递归完右子树重新从根节点路过递归遍历左子树的时候,路过的重复深度的树层的树

这个在遍历完右子树后,如果左子树还有比右子树深度大的才会进入答案

class Solution {
    vector<int> ans;

    void dfs(TreeNode* node, int depth) {
        if (node == nullptr) {
            return;
        }
        if (depth == ans.size()) { // 这个深度首次遇到
            ans.push_back(node->val);
        }
        cout<<node->val<<endl;
        dfs(node->right, depth + 1); // 先递归右子树,保证首次遇到的一定是最右边的节点
        dfs(node->left, depth + 1);
    }

public:
    vector<int> rightSideView(TreeNode* root) {
        dfs(root, 0);
        return ans;
    }
};

2.层序遍历

思路好想,代码也是模板,不多说了

class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector<vector<int>> res;
        queue<TreeNode*> q;
        if(root==nullptr)
            return res;
        q.push(root);
        while(!q.empty())
        {
            int size=q.size();
            vector<int> path;
            for(int i=0;i<size;i++)
            {
                TreeNode *t=q.front();
                q.pop();
                path.push_back(t->val);
                if(t->left)
                    q.push(t->left);
                if(t->right)
                    q.push(t->right);
            }
            res.push_back(path);
        }
        return res;
    }
};

114.二叉树展开为链表

114. 二叉树展开为链表 - 力扣(LeetCode)

用一个vector把前序遍历结点存储一下,然后再把它串成链表

class Solution {
public:
    vector<TreeNode *> res;
    void tra(TreeNode *t)
    {
        if(t==nullptr)
            return;
        res.push_back(t);
        tra(t->left);
        tra(t->right);
    }
    void flatten(TreeNode* root) {
        tra(root);
        for(int i=1;i<res.size();i++)
        {
            res[i-1]->right=res[i];
            res[i-1]->left=nullptr;
        }
        return ;
    }
};

http://www.kler.cn/news/353232.html

相关文章:

  • 海南聚广众达电子商务咨询有限公司靠谱吗怎么样?
  • 《使用Gin框架构建分布式应用》阅读笔记:p88-p100
  • LeetCode53:最大子数组和
  • Go:error处理机制和函数
  • 听泉鉴宝在三个月前已布局商标注册!
  • 某ai gpt的bug
  • python配合yolov11开发分类训练软件
  • Linux操作系统小项目——实现《进程池》
  • 玛哈特矫平机:塑造未来制造业的平整基石
  • 微服务子项目中SpringBoot启动时无法正常加载yml配置文件
  • C++学习路线(十三)
  • 【Linux】Linux下进程Vs线程
  • 【IEEE独立出版 | 厦门大学主办】第四届人工智能、机器人和通信国际会议(ICAIRC 2024)
  • fiber的原理
  • CTFHUB技能树之SQL——报错注入
  • 算法专题七: 分治归并
  • 【C#】WPF MVVM 简单示例代码
  • 深入了解Spring重试组件spring-retry
  • 【python】极简教程4-接口设计
  • 开源影像tif切图工具gdal2tiles部署以及切图
  • 给定数组找出出现次数超过数组长度一半的数
  • ETL转换:金蝶云和旺店通数据集成全流程
  • 详解23种设计模式
  • MySQL新手向:对比常用存储引擎
  • 人工智能正在扼杀云计算的可持续性
  • gitlab的基本用法之创建用户和组