算法小知识-------02·08-------二叉树

137 阅读2分钟

这是我参与2022首次更文挑战的第16天,活动详情查看:2022首次更文挑战

二叉树的题型很多,其中个中的逻辑处理多半需要遍历,dfs和bfs用的较多,本篇的两题均用dfs实现

二叉树的直径

该题出自力扣的543题 —— 二叉树的直径【简单题】

审题

给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。

  • 根据题意,找出一个节点的最长直径,也就是以一个节点为中心,最大左子树深度+最大右子树深度
  • 题目也有强调,不一定穿过根节点,因为根节点的左右子树可能并没有延伸
  • 以深度遍历为解题思路:
    • 分别计算出最大左子树深度和最大右子树深度
    • 利用全局变量赋值最大直径

解题

class Solution {
    int max;
    public int diameterOfBinaryTree(TreeNode root) {
        max = 1;
        dfs(root);
        return max -1;
    }

    public int dfs(TreeNode root){
        if (root == null)return 0;
        int left = dfs(root.left);
        int right = dfs(root.right);
        max = Math.max(left+right+1,max);
        return Math.max(left,right)+1;
    }
}

image.png

合并二叉树

该题出自力扣的617题 —— 合并二叉树【简单题】

审题

给你两棵二叉树: root1 和 root2 。想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会 重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。 返回合并后的二叉树。注意: 合并过程必须从两个树的根节点开始。

  • 题意也很简单,就是把两个二叉树,每个节点相加,最终合并成一个二叉树,并且返回根节点
  • 先把根节点合并
  • 通过dfs遍历分别把两个二叉树的左节点、右节点递归
  • 最终返回根节点

编码

    public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
        if (root1 == null)return root2;
        if (root2 == null)return root1;

        TreeNode root = new TreeNode(root1.val+root2.val);
        root.left = mergeTrees(root1.left,root2.left);
        root.right = mergeTrees(root1.right,root2.right);
        return root;
    }

image.png