leetcode 1028. 从先序遍历还原二叉树
我们从二叉树的根节点 root 开始进行深度优先搜索。
在遍历中的每个节点处,我们输出 D 条短划线(其中 D 是该节点的深度),然后输出该节点的值。(如果节点的深度为 D,则其直接子节点的深度为 D + 1。根节点的深度为 0)。
如果节点只有一个子节点,那么保证该子节点为左子节点。
给出遍历输出 S,还原树并返回其根节点 root。
示例 1:
输入:"1-2--3--4-5--6--7"
输出:[1,2,5,3,4,6,7]
示例 2:
输入:"1-2--3---4-5--6---7"
输出:[1,2,5,3,null,6,null,4,null,7]
示例 3:
输入:"1-401--349---90--88"
输出:[1,401,null,349,88,90]
提示:
原始树中的节点数介于 1 和 1000 之间。
每个节点的值介于 1 和 10 ^ 9 之间。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/recover-a-tree-from-preorder-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
分为两个步骤:
1:解析字符串,获取每个节点和其对应的深度。分别存储到两个list中。
2:根据两个list,来构建树,因为是前序遍历,可直接按照前序递归遍历来构建,定义了全局遍历来记录遍历的索引位置。
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { * this.val = val; * this.left = left; * this.right = right; * } * } */ class Solution { int item = 1; int end; List<Integer> valList; List<Integer> dList; public TreeNode recoverFromPreorder(String traversal) { List<Integer> valList = new ArrayList<>(); List<Integer> dList = new ArrayList<>(); int value = 0; int d = 0; boolean flag = true; dList.add(0); for (byte b : traversal.getBytes()) { if (b == 45) { d++; flag = false; } else { if (flag) { value = value * 10 + (b - 48); } else { valList.add(value); dList.add(d); value = (b - 48); d = 0; } flag = true; } } valList.add(value); this.valList = valList; this.dList = dList; this.end = valList.size(); TreeNode root = new TreeNode(valList.get(0)); find(root, 0); return root; } private void find(TreeNode node, int n) { if (item == end) { return; } int a = item; int last = dList.get(n) + 1; int td = dList.get(a); if (last == td) { item++; Integer value = valList.get(a); TreeNode c = new TreeNode(value); node.left = c; find(c, a); } if (item == end) { return; } a = item; td = dList.get(a); if (last == td) { item++; Integer value = valList.get(a); TreeNode c = new TreeNode(value); node.right = c; find(c, a); } } }