leetcode 1028. 从先序遍历还原二叉树

Posted 旺仔古李

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);
        }
    }
}

 

以上是关于leetcode 1028. 从先序遍历还原二叉树的主要内容,如果未能解决你的问题,请参考以下文章

leetcode1028. 从先序遍历还原二叉树

leetcode1028. 从先序遍历还原二叉树

leetcode1028. 从先序遍历还原二叉树

leetcode 1028. 从先序遍历还原二叉树

LeetCode 1028. 从先序遍历还原二叉树

leetcode 968. 1028. 从先序遍历还原二叉树解题报告[待完善...]