我们从二叉树的根节点 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 之间。

思路:

利用栈

两个相邻的结点只可能存在两种关系

1.后者是前者的左子节点

2.后者与前者无关,是更前面某一个节点的右子节点

/**

* Definition for a binary tree node.

* public class TreeNode {

*     int val;

*     TreeNode left;

*     TreeNode right;

*     TreeNode(int x) { val = x; }

* }

*/

class Solution {

public TreeNode recoverFromPreorder(String S) {

if(S==null||S.length()==0){

return null;

}

Stack<TreeNode> stack = new Stack<>();

TreeNode root = new TreeNode(S.charAt(0)-'0');

int index=0;

while(index<S.length()){

int level = 0;

//记录当前找个节点处于第几层(通过看他前面有几条短线)

while(S.charAt(index)=='-'){

index++;

level++;

}

int value = 0;

while (index < S.length() && Character.isDigit(S.charAt(index))) {

value = value * 10 + (S.charAt(index) - '0');

++index;

}

TreeNode temp = new TreeNode(value);

//如果栈中节点遍历到的层数和新节点处于的层数一样,那么新节点是之前节点的左子节点,压入栈中

if(level==stack.size()){

if(!stack.isEmpty()){

stack.peek().left = temp;

}

//依次遍历到新节点父亲的层数,其他的出栈

}else{

while(level!=stack.size()){

stack.pop();

}

stack.peek().right=temp;

}

stack.push(temp);

}

//有的结点可能未出栈,依次退栈,只留下树根返回

while(stack.size()>1){

stack.pop();

}

return stack.peek();

}

}

Leetcode--1028. 从先序遍历还原二叉树(Java)相关推荐

  1. LeetCode 1028. 从先序遍历还原二叉树(栈)

    文章目录 1. 题目 2. 栈解题 1. 题目 我们从二叉树的根节点 root 开始进行深度优先搜索. 在遍历中的每个节点处,我们输出 D 条短划线(其中 D 是该节点的深度),然后输出该节点的值.( ...

  2. leetcode 题库1028--从先序遍历还原二叉树

    从先序遍历还原二叉树 我们从二叉树的根节点 root 开始进行深度优先搜索. 在遍历中的每个节点处,我们输出 D 条短划线(其中 D 是该节点的深度),然后输出该节点的值.(如果节点的深度为 D,则其 ...

  3. js怎么取到遍历中的特定值_LeetCode 1028 hard 从先序遍历还原二叉树 Python解题记录...

    我们在该专栏中记录了我俩的刷题记录. 我们更新的所有题目都在目录中. 今天的题目是 力扣​leetcode-cn.com 题目 We run a preorder depth first search ...

  4. leetcode1028. 从先序遍历还原二叉树(dfs/栈)

    我们从二叉树的根节点 root 开始进行深度优先搜索. 在遍历中的每个节点处,我们输出 D 条短划线(其中 D 是该节点的深度),然后输出该节点的值.(如果节点的深度为 D,则其直接子节点的深度为 D ...

  5. 数据结构基础 后序遍历和中序遍历还原二叉树

    [问题描写叙述] 二叉树            A        /       /        B       C      /   /   /   /      D   E   F   G   ...

  6. 每天一道LeetCode-----根据先序遍历和中序遍历还原二叉树

    Construct Binary Tree from Preorder and Inorder Traversal 原题链接Construct Binary Tree from Preorder an ...

  7. C++ 先序遍历还原二叉树

    输入数组,数组中为树先序遍历结果,空节点值为-1 Node* createTree(vector<int> nums, int &pos) {int n = nums.size() ...

  8. leetcode算法题--从先序遍历还原二叉树

    原题链接:https://leetcode-cn.com/problems/recover-a-tree-from-preorder-traversal/ 迭代 + 栈 TreeNode* recov ...

  9. 算法-从先序遍历还原二叉树

    题目: 我们从二叉树的根节点 root 开始进行深度优先搜索.在遍历中的每个节点处,我们输出 D 条短划线(其中 D 是该节点的深度),然后输出该节点的值.(如果节点的深度为 D,则其直接子节点的深度 ...

最新文章

  1. 从 Android 静音看正确的查bug的姿势?
  2. 面霸篇:高频 Java 基础问题(核心卷一)
  3. ubuntu 21.04安装OBS Studio录屏软件
  4. 服务器日志显示意外关闭,服务器事件日志
  5. isfull mysql_MySQL数据库之MySQL 出现 The table is full 的解决方法
  6. 赣南师范大学科技学院计算机科学与技术,2021江西独立学院转设最新消息(新增两所):赣南师范大学科技学院转设公办?...
  7. OpenCV-除法运算cv::divide
  8. 多层full-connect 神经网络测试
  9. 【重磅开源】Facebook开源 Nevergrad:一种用于无梯度优化的开源工具
  10. 国产卫星高分四号(GF4)预处理(辐射定标)
  11. 1)hadoop集群搭建
  12. 中艺人脸识别考勤机使用方法_中控人脸识别考勤机说明书 人脸识别考勤机的使用方法...
  13. 昨天买的电动车今天上牌了
  14. QT的QScrollArea使用详解
  15. 15 款精致mac应用
  16. Python发送多附件邮件的方法
  17. Shiro系统权限管理、及原理剖析
  18. 深入探索Android布局优化(上)
  19. 关于“IT学子成长指导”专栏及文章目录
  20. 教你怎么淘宝导入快递单号批量发货

热门文章

  1. 程序员面试金典 - 面试题 05.04. 下一个数(线性扫描)
  2. 判断 Python 对象是否包含某个属性的方法
  3. 四舍五入_从四舍五入谈起
  4. pygame render怎么显示中文_Pygame游戏——贪吃蛇(完结)
  5. BP算法是从天上掉下来的吗?
  6. 互联网热门职位薪酬报告
  7. 论文浅尝 | 使用预训练深度模型和迁移学习方法的端到端模糊实体匹配
  8. 论文阅读课4-Long-tail Relation Extraction via Knowledge Graph Embeddings(GCN,关系抽取,2019,远程监督,少样本不平衡,2注意
  9. NoSQL那些事--Redis
  10. 02 复习流程语句 以及跳转语句