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

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


我们从二叉树的根节点 root 开始进行深度优先搜索。

在遍历中的每个节点处,我们输出 D 条短划线(其中 D 是该节点的深度),然后输出该节点的值。(如果节点的深度为 D,则其直接子节点的深度为 D + 1。根节点的深度为 0)。

如果节点只有一个子节点,那么保证该子节点为左子节点。
给出遍历输出 S,还原树并返回其根节点 root。

示例 1:
在这里插入图片描述

输入:“1-2–3--4-5–6--7”
输出:[1,2,5,3,4,6,7]

递归解法

从左到右按顺序遍历字符串,递归终止条件是深度。如果当前层的深度小于等于上一层,呢么就返回null。

class Solution {
    public TreeNode recoverFromPreorder(String S) {
        int start = 0;
        //查找数字
        for (; start < S.length(); start++) {
            if (S.charAt(start) == '-') {
                break;
            }
        }
        String ss = S.substring(0,start);
        //System.out.println(ss);
        TreeNode root = new TreeNode(Integer.valueOf(ss));
        //index每次位置是数字的位置,1-2--3,这一步让index在0位置
        index = start - 1;
        root.left = fun(S,0);
        root.right = fun(S,0);
        return root;
    }
    private int index = 0;//index记录坐标
    public TreeNode fun(String s,int depth) {
        int c = getNextDepth(s,index);
        if (c <= depth || index > s.length() - 1) return null;
        //更新depth,在数字位置上面,而不是'-'。对于1-2--3,index这时应该在2位置
        index += (c +1);
        //查找数字
        int a = index;
        for (; a < s.length(); a++) {
            if (s.charAt(a) == '-') {
                break;
            }
        }
        String ns = s.substring(index,a);
        //System.out.println("ns = "+ns+" index = "+index+" a = "+a);
        int num = Integer.valueOf(ns);
        TreeNode now = new TreeNode(num);
        index = a - 1;
        now.left = fun(s,c);
        now.right = fun(s,c);
        return now;
    }
    public int getNextDepth(String s,int ind) {
        int c = 0;
        for (int i = ind + 1; i < s.length(); i++) {
            if (s.charAt(i) == '-') {
                c++;
            } else {
                break;
            }
        }
        return c;
    }
}

u1s1,一遍就过了,这道题hard给高了。
leetcode 112

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值