- 考虑最小情况,两个单独的节点,a,b
- 如果 a != null && b != null,就是正常情况下,只需要计算和,加到 a 节点上
- 因为还需要修改链的指向,递归修改 a 的左右孩子,
类似于前序遍历
,a.left = f(a.left, b.left),a.right = f(a.right, b.right) - 考虑递归的出口,当其中一个节点为空时,返回另一个节点(可能为空),让上一个节点的左右链指向该节点
递归
// 自顶向下递归(最容易想到),先计算,再递归
public TreeNode mergeTrees (TreeNode t1, TreeNode t2) {
// write code here
if(t1 == null) return t2;
if(t2 == null) return t1;
t1.val += t2.val; // 正常情况下
t1.left = mergeTrees(t1.left, t2.left); // 递归修改左孩子链
t1.right = mergeTrees(t1.right, t2.right); // 递归修改右孩子链
return t1; // 当节点的左右孩子链修改后,返回到父节点
}
// 自低向上递归,先递归到最底部,再计算,再逐层返回
public TreeNode mergeTrees (TreeNode t1, TreeNode t2) {
// write code here
if(t1 == null) return t2;
if(t2 == null) return t1;
t1.left = mergeTrees(t1.left, t2.left); // 递归修改左孩子链
t1.right = mergeTrees(t1.right, t2.right); // 递归修改右孩子链
t1.val += t2.val; // 正常情况下
return t1; // 当节点的左右孩子链修改后,返回到父节点
}
- 总结:二叉树的前序遍历(递归 / DFS)+ 节点链的修改