这是我参与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;
}
}
合并二叉树
该题出自力扣的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;
}