合并二叉树 JavaScript版

本文介绍了如何使用JavaScript将两棵二叉树合并为一棵,按照题目描述,合并规则是节点值相加,不存在的节点由另一棵树的节点代替。首先,通过多行输入获取节点数据,然后将数据转换为二叉树结构。接着,利用递归方法合并两棵树,最后通过非递归的层序遍历输出合并后的树的节点值。

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

考点:二叉树遍历,二叉树建立,多行输入,数组。
题目描述:
已知两颗二叉树,将它们合并成一颗二叉树。合并规则是:都存在的结点,就将结点值加起来,否则空的位置就由另一个树的结点来代替。例如:
两颗二叉树是:
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表示空。保证如果儿子不为空,则儿子编号大于父亲编号。)

输出描述:

输出合并后树按层遍历的各结点权值,相邻权值之间以一个空格相间。

本题在牛客网的瓜子二手车编程题中出现,首先需要控制输入,输入是由第一行的两个数字决定接下来输入的行数。所以需要首先js的多行输入。

var readline=require('readline')
const r1=readline.createInterface({
   
   
	input:process.stdin,
	output:process.stdout
})
var linesArrayIndex=0;
var linesArray=[];
var resultArray=[];
r1.on('line',function(line){
   
   
	if(linesArrayIndex==0){
   
   
		var length=line.split(' ');
		var n1=length[0];
		var n2=length[1];
		linesArray[linesArrayIndex]=n1+n2;
		//首行加入输入流队列,并表示接下来的输入行数。
	}else{
   
   
		linesArray[linesArrayIndex]=line;
		resultArray.push(line);
	}
	linesArrayIndex++;
	if(resultArray.length==n1+n2){
   
   
		///之后对结果数组进行的操作
	}
})

此时得到的输入数组是

[‘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’]

需要将这一整个数组根据两个节点个数n1和n2分割,并转换成二叉树的数据结构。

function stringtonumberarr(array){
   
   
 	let newarr=[];
    for(let i of array){
   
   
        let temparr=i.split(' ');
        var newtemp=[];
        for(let j of temparr){
   
   
            j=parseInt(j);
            newtemp.push(j);
        }
        newarr.push(newtemp)
    }
    return newarr;
}
let arr1=[];
let arr2=[];
for(let i=0;i<n1;i++){
   
   
    arr1.push(resultArray[i]);
}
let arrone=stringtonumberarr(arr1);
for(let i=0;i<n2;i++){
   
   
    arr2.push(resultArray[i+n1]);
}
let arrtwo=stringtonumberarr(arr2);

经过以上转换,数组元素不再为字符串而是数值型。

将处理过的数组转换为二叉树。

[ [2 ,3 ,1], [4 ,0 ,3], [0 ,0 ,2], [0 ,0 ,5] ]

我的想法是,假设数组为arr,arr[0][0]如果不为0,则表示该节点有左孩子,同理可知是否有右孩子。
将左右标记为true,若为0则为null。
然后再将节点连接,通过编号对应数组下标,找到对应的父子节点然后连接。

var inittree = function (arr) 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值