提示:日暮待情人,维舟绿杨岸
合并两个二叉树
想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 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行