leetcode第1028题,困难
题目描述如下
我们从二叉树的根节点 root 开始进行深度优先搜索。
在遍历中的每个节点处,我们输出 D 条短划线(其中 D 是该节点的深度),然后输出该节点的值。(如果节点的深度为 D,则其直接子节点的深度为 D + 1。根节点的深度为 0)。
如果节点只有一个子节点,那么保证该子节点为左子节点。
给出遍历输出 S,还原树并返回其根节点 root。
输入:"1-2--3--4-5--6--7" 输出:[1,2,5,3,4,6,7]
思路分析:
首先将字符串中的数据解析出来,即节点值和节点的深度,放入队列中
[{node:1,depth:0}, {node:2,depth:1},{node:3,depth:2},{node:4,depth:2},{node:5,depth:1},{node:6,depth:2},{node:7,depth:2}]
那么我们可以发现,每次从队列中将第一个值取出,那么之后队列中替补上来的第一个值,要嘛是刚才取出值的子节点,要嘛是取出值的兄弟节点。这个是从先序遍历特征可知,不再赘述。
如果是子节点,就建立左右子关系后,重复以上步骤。
如果是兄弟节点,那么我们直接返回递归,返回上一层后,就又形成父子节点关系,继续重复以上步骤。
用伪代码表示如下
function makeTree(node){
//如果是子节点执行一下遍历,否则,返回递归
while(queue.lenth > 0 && node.path +1 === queue[0].path){
if(!node.left) node.left = queue[0];
else node.right = queue[0];
makeTree(queue.shift());
}
}
root = queue.shift();
makeTree(root);
以上就是核心代码,具体的实现不再赘述