思路:
有两棵树,然后相同节点对应相加求和,空节点的话则表示为0,则表示X+0即可。
那么对于树这样的结构应该怎么做到对应的节点对应相加。是该先遍历树存储,还是怎么?
解答:
两棵树同时进行前序遍历,并将对应的节点进行合并。在遍历时,如果两棵树的当前节点均不为空,我们就将它们的值进行相加,并对它们的左孩子和右孩子进行递归合并;如果其中有一棵树为空,那么我们返回另一颗树作为结果;如果两棵树均为空,此时返回任意一棵树均可(因为都是空)。
前序遍历:前序遍历就是先输出根节点,然后左孩子,最后右孩子;
伪代码:
void preorder_traverse(const struct bi_tree *tree)
{
if(tree){
access(tree->data);//根节点
if(tree->left){
preoder_traverse(tree->left);//左子树
}
if(tree->right){
preoder_traverse(tree->right);//右子树
}
}
}
递归代码实现合并二叉树:
`public class Solution{
public TreeNode mergeTree(TreeNode t1,TreeNode t2){
if(t1==null)
return t2;
if(t2==null)
return t1;//选择T1作为合并的树
t1.val+=t2.val;
t1.left=mergeTrees(t1.left,t2.left);//分别对左子树,右子树进行合并
t1.right=mergeTrees(t1.right,t2.right);
return t1;
}
}`
时间复杂度:
时间复杂度:O(n),其中 n 是两棵树中节点个数的较小值。
空间复杂度:O(n),在最坏情况下,会递归 n 层,需要 O(n)的栈空间。