合并两个二叉树

本文详细介绍了如何通过递归及迭代方式合并两棵二叉树。递归方法直观易懂,而迭代方法则利用了层序遍历的特性,确保了节点值正确相加,同时处理了空节点的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

提示:日暮待情人,维舟绿杨岸


合并两个二叉树

想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。
请添加图片描述
输入:root1 = [1,3,2,5], root2 = [2,1,3,null,4,null,7]
输出:[3,4,5,5,4,null,7]

思路

先合并根结点 然后合并子树 这里依然是使用递归的方式,若是到达T1等于NULL 直接返回T2 便可 因为无论T2 是不是为NULL 这个时候T2 的后继都不会改变了,若是T2=NULL 这个时候直接返回T1 因为无论T 1是不是为空这个时候都让T2 的父亲指向T1

递归代码

BiTree* CombinTree(BiTree* T1,BiTree* &T2){
	//这里我们将T1树放在T2上
	if(T1==NULL) return T2;
	if(T2==NULL) return T1;
	T2->data+=T1->data;
	T2->Lchild=CombinTree(T1->Lchild,T2->Lchild);
	T2->Rchild=CombinTree(T1->Rchild,T2->Rchild); 
	return T2;
}

迭代代码

迭代这里我们使用的是层序遍历 为什么使用层序遍历 这里我认为应为层序遍历好同步 第一层若是都存在则同步第二层较容易 当你要同步第三层的时候第二层已经同步过了 所以这里使用层序遍历,并且要理解第三个第四个if 因为此时无论第一个子树此时是怎么样的 都赋值给第二个数此时的结点,并且之前层序遍历中都是 若是左孩子或者有孩子存在直接放入队列中 但是这里是只有两个同时都存在时 才会将子孩子放入到队列中,这个迭代还是有一定难度的

BiTree* LevelComTree(BiTree* T1,BiTree* T2){//这里我们是使用的是队列来完成这个操作
	queue<BiTree*> Q1; BiTree* cur1;
	queue<BiTree*> Q2; BiTree* cur2;
	if(T1==NULL){//跟前面一样  若是为空则不需要进队  直接返回即可 
		return T2; 
	}
	if(T2==NULL){
		return T1;
	} 
	Q1.push(T1); Q2.push(T2);
	while(!Q2.empty()){
		int size1=Q1.size();//需要一个值来保存 因为Q.size 是一直变得 
		int size2=Q2.size(); 
		for(int i=0;i<size2;i++){
			cur1=Q1.front();cur2=Q2.front();
			cur2->data+=cur1->data; 
			if(cur1->Lchild&&cur2->Lchild){
				Q1.push(cur1->Lchild);
				Q2.push(cur2->Lchild);
			}
			if(cur1->Rchild&&cur2->Rchild){
				Q1.push(cur1->Rchild);
				Q2.push(cur2->Rchild);
			}
			if(cur2->Rchild==NULL){//并且不需要放入队列中 
				cur2->Rchild=cur1->Rchild;
			}
			if(cur2->Lchild==NULL){//此时不管cur1如何fou赋值给cur2 
				cur2->Lchild=cur1->Lchild; 
			} 
			Q1.pop();
			Q2.pop();
		}
		cout<<endl;
	}
} 

运行截图

请添加图片描述

总结

csdn文章推荐受影响解决办法10个字10行
csdn文章推荐受影响解决办法10个字10行
csdn文章推荐受影响解决办法10个字10行
csdn文章推荐受影响解决办法10个字10行
csdn文章推荐受影响解决办法10个字10行
csdn文章推荐受影响解决办法10个字10行
csdn文章推荐受影响解决办法10个字10行
csdn文章推荐受影响解决办法10个字10行
csdn文章推荐受影响解决办法10个字10行
csdn文章推荐受影响解决办法10个字10行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值