• 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. }

    持续更新中~~

  • 相关阅读:
    华为机试真题 Java 实现【学生方阵】
    算法——回溯法(1)
    Java变量和字面量教程
    PostgreSQL逻辑复制(Logical Replication)原理
    AI绘画的崛起与多平台对比
    Laravel 博客开发|管理后台里程碑管理
    XML文件反序列化读取
    如何一个模型走天下?集成训练多数据集,打造通用目标检测模型方法详解
    golang sync.Map 在函数传参时默认是值传递
    【李航统计学习笔记】第九章:EM算法
  • 原文地址:https://blog.csdn.net/weixin_72076848/article/details/126141693