• leetcode二叉树系列(二)


    1、二叉树展开为链表

    二叉树展开为链表

    题目描述:

     1)暴力拼接

    思路:就是遍历每一个节点root,找到当前节点左子树的最右节点pre,

    pre.right = root.right

    root.right = root.left

    root.left = null

    这样遍历每一个节点,就可以去掉所有节点的左子树

    代码如下:

    1. public void flatten(TreeNode root) {
    2. TreeNode pre;
    3. while (root!=null){
    4. //左子树为空,则跳过
    5. if (root.left == null) {
    6. root = root.right;
    7. } else {
    8. pre = root.left;
    9. //找到当前节点左子树的最右节点
    10. while (pre.right != null) pre = pre.right;
    11. pre.right = root.right;
    12. root.right = root.left;
    13. root.left = null;
    14. root = root.right;
    15. }
    16. }

    2)先序遍历拼接

    思路:根据先序遍历的顺序依次,把左子树拼接到右子树

    代码如下:

    1. TreeNode pre;
    2. public void flatten(TreeNode root) {
    3. if(root == null) return;
    4. TreeNode left = root.left;
    5. TreeNode right = root.right;
    6. root.left = null;
    7. if(pre != null) pre.right = root;
    8. pre = root;
    9. flatten(left);
    10. flatten(right);
    11. }

    3)后序遍历拼接(变种)

    思路:于先序遍历完全相反,由右子树最右节点开始,依次拼接

    代码:

    1. TreeNode last;
    2. public void flatten(TreeNode root) {
    3. if (root == null ) return;
    4. flatten(root.right);
    5. flatten(root.left);
    6. //pre表示最后一个节点,依次往上建立
    7. root.right = last;
    8. root.left = null;
    9. last = root;
    10. }

    总结:这道题万变不离其宗,根据先序遍历的顺序,把左子树拼接到右子树,了解这点就很简单

    2、二叉树中的最大路径和

    二叉树中的最大路径和

    题目描述:

     

     思路:题目是要我们求最大路径和,规定路径的节点只能出现一次

     

     如图路径一般有四种情况

    1. 我自己就是一条路径
    2. 只跟左子节点合并成一条路径
    3. 只跟右子节点合并成一条路径
    4. 以自己为桥梁,跟左、右子节点合并成一条路径

    我们就需要用到递归,求出每一个结点的2、3情况,并返回较大的路径和

    同时,在每次递归时,都需要不断进行最大路径和的判断,因为我们不知道在哪个节点时会取到最大路径和!

    进入代码:

    1. int max = Integer.MIN_VALUE;
    2. public int maxPathSum(TreeNode root) {
    3. dfs(root);
    4. return max;
    5. }
    6. public int dfs(TreeNode root){
    7. if (root == null) return 0;
    8. //由于路径加起来可能是负的,所以做一个比较
    9. int leftPath = Math.max(0,dfs(root.left));
    10. int rightPath = Math.max(0,dfs(root.right));
    11. max = Math.max(max,root.val + leftPath + rightPath);
    12. //返回左边路径和或者右边路径和的较大值
    13. return root.val + Math.max(leftPath,rightPath);
    14. }

    持续更新中~~

  • 相关阅读:
    追寻红色记忆、晋国文明之思考毕业季研学营
    Telnet 测试 UDP 端口?
    UG\NX二次开发 在资源栏(左侧面板)中添加按钮
    代码整洁之道-读书笔记之错误处理
    Java多线程
    Redis持久化(RDB AOF)
    数据结构(严蔚敏版)第一章——复数的实现
    【HMS core】【FAQ】push kit、AR Engine、广告服务、扫描服务典型问题合集2
    C++:模板(非类型模板参数、类模板的特化、模板的分离编译)
    python+nodejs+vue社区志愿者活动报名服务管理系统源码
  • 原文地址:https://blog.csdn.net/weixin_72076848/article/details/126141693