已知两颗二叉树,将它们合并成一颗二叉树。合并规则是:都存在的结点,就将结点值加起来,否则空的位置就由另一个树的结点来代替。例如:
两颗二叉树是:
Tree 1
1
/ \
3 2
/
5
Tree 2
2
/ \
1 3
\ \
4 7
合并后的树为
3
/ \
4 5
/ \ \
5 4 7
第一行输入整数n,m。(分别表示树1和树2的节点数,1<=n,m<=100)
接下来n行,第i行三个整数l,r,v, (0<=l,r<=n , 0<=v<=100) ,表示第一棵树的第i个结点的左儿子编号,右儿子编号和权值。
接下来m行,第i行三个整数l,r,v, (0<=l,r<=n , 0<=v<=100) ,表示第二棵树的第i个结点的左儿子编号,右儿子编号和权值。
(对于左右儿子,如果编号为0表示空。保证如果儿子不为空,则儿子编号大于父亲编号。)
输出合并后树按层遍历的各结点权值,相邻权值之间以一个空格相间。
4 5 2 3 1 4 0 3 0 0 2 0 0 5 2 3 2 0 4 1 0 5 3 0 0 4 0 0 7
3 4 5 5 4 7
见题目描述
import java.util.Scanner;
import java.util.Map;
import java.util.HashMap;
import java.util.Deque;
import java.util.ArrayDeque;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int nodeNum1 = sc.nextInt();
int nodeNum2 = sc.nextInt();
int[] treeArray1 = new int[3 * nodeNum1];
int[] treeArray2 = new int[3 * nodeNum2];
for (int i = 0; i < treeArray1.length; i++)
treeArray1[i] = sc.nextInt();
for (int i = 0; i < treeArray2.length; i++)
treeArray2[i] = sc.nextInt();
sc.close();
TreeNode t1 = TreeNode.genTree(treeArray1);
TreeNode t2 = TreeNode.genTree(treeArray2);
TreeNode merge = mergeTree(t1, t2);
BFS(merge);
}
public static TreeNode mergeTree(TreeNode t1, TreeNode t2){
if (t1 != null && t2 != null){
t1.left = mergeTree(t1.left, t2.left);
t1.right = mergeTree(t1.right, t2.right);
t1.val += t2.val;
return t1;
}
return t1 == null ? t2 : t1;
}
//层次遍历
public static void BFS(TreeNode root){
if (root == null)
return;
Deque<TreeNode> queue = new ArrayDeque<>();
queue.offer(root);
int currentSize = queue.size();
while (!queue.isEmpty()){
while (currentSize-- > 0){
root = queue.poll();
System.out.print(root.val + " ");
if (root.left != null || root.right != null){
if (root.left != null)
queue.offer(root.left);
if (root.right != null)
queue.offer(root.right);
}
}
currentSize = queue.size();
}
}
}
class TreeNode{
TreeNode left;
TreeNode right;
int val;
public TreeNode(int val){
this.val = val;
}
//生成树
public static TreeNode genTree(int[] array){
Map<Integer, TreeNode> tmp = new HashMap<>();
TreeNode root = new TreeNode(0);
TreeNode head = root;
for (int i = 0, layer = 1; i < array.length; i += 3, layer++){
int left = array[i];
int right = array[i + 1];
int val = array[i + 2];
if (tmp.containsKey(layer))
root = tmp.get(layer);
root.val = val;
if (left == 0)
root.left = null;
else {
root.left = new TreeNode(0);
tmp.put(left, root.left); //若左子树不为空将编号映射,在对应层数在赋值
}
if (right == 0)
root.right = null;
else {
root.right = new TreeNode(0);
tmp.put(right, root.right);//若右子树不为空将编号映射,在对应层数在赋值
}
}
return head;
}
}