题目:

我们从二叉树的根节点 root 开始进行深度优先搜索。在遍历中的每个节点处,我们输出 D 条短划线(其中 D 是该节点的深度),然后输出该节点的值。(如果节点的深度为 D,则其直接子节点的深度为 D + 1。根节点的深度为 0)。如果节点只有一个子节点,那么保证该子节点为左子节点。给出遍历输出 S,还原树并返回其根节点 root。

输入:"1-2--3--4-5--6--7"
输出:[1,2,5,3,4,6,7]

几个技术要点:

单个char 转数字:

    public static void main(String[] args) {char a = '3';char b = '0';System.out.println(a - b);}

多个char 转数字:

                //因为节点的值介于 1 和 10 ^ 9 之间,所以需要遍历计算valwhile (i < s.length() && Character.isDigit(s.charAt(i))){val = val * 10 + (s.charAt(i) -  '0');i ++;}

解决思路:

假如我们的二叉树如下图所示,我们需要的是,每解析到一个节点,把他跟栈中的父节点做比较。如果是左节点,那么就直接放到栈中,如果是右节点,那么需要把左节点出栈,然后把父节点的右节点指派为当前节点,然后把右节点放到栈中。


整个过程如下图:

整体解决方法:

/*** 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) {//最终的返回的根节点TreeNode root = null;Stack<TreeNode> stack = new Stack<>();//记录上一次遍历到第几层int prevLevel = 0;//当前层int cutLevel = 0;//节点值int val = 0;int i = 0;while (i < s.length()){/*** 如果root==null,先设置根节点*/if(root == null){//因为节点的值介于 1 和 10 ^ 9 之间,所以需要遍历计算valwhile (i < s.length() && Character.isDigit(s.charAt(i))){val = val * 10 + (s.charAt(i) -  '0');i ++;}root = new TreeNode(val);//根节点入栈stack.push(root);}else if(s.charAt(i) == '-'){cutLevel ++;i++;}else {val = 0;while (i < s.length() && Character.isDigit(s.charAt(i))){val = val * 10 + (s.charAt(i) -  '0');i ++;}/*** 左子树* 如果当前cutLevel > prevLevel,说明是下一级,取栈顶节点* */if(cutLevel > prevLevel){TreeNode node = stack.pop();node.left = new TreeNode(val);//入栈的时候,需要将之前栈顶元素先入栈,然后node.left或者node.right再入栈stack.push(node);stack.push(node.left);//然后cutLevel赋给prevLevel,cutLevel置0prevLevel = cutLevel;cutLevel = 0;} else {/*** 右子树* 根据cutLevel的值,回溯到上一级*/while (stack.size() > cutLevel){stack.pop();}TreeNode node = stack.pop();node.right = new TreeNode(val);stack.push(node);stack.push(node.right);prevLevel = cutLevel;cutLevel = 0;}}}return root;}
}

https://leetcode-cn.com/problems/recover-a-tree-from-preorder-traversal/

算法-从先序遍历还原二叉树相关推荐

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

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

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

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

  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. 每天一道LeetCode-----根据先序遍历和中序遍历还原二叉树

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

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

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

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

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

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

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

  9. Leetcode--1028. 从先序遍历还原二叉树(Java)

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

最新文章

  1. ADC的有效位数和信纳比计算
  2. 同步两个数据库的结构或者数据
  3. python编程入门经典实例-【python】编程语言入门经典100例--30
  4. jquery实现滚动条滚动到一定高度导航固定不变
  5. 基于easyui开发Web版Activiti流程定制器详解(六)——Draw2d详解(二)
  6. 一维战舰(51Nod-1521)
  7. mac python安装第三方库jupyter_Mac搭建jupyter环境
  8. CSS基础——定位 (position)【学习笔记】
  9. unity播放视频代码
  10. vs2010专业版下载链接
  11. codewars题目解答Multiples of 3 or 5
  12. 典型用户和用户场景描述
  13. ABAQUS中inp文件的使用和书写
  14. c4droid用c语言画爱心,【图片】[自学C语言第五天]发一个作品【c4droid吧】_百度贴吧...
  15. 计算机er保研选网络安全方向怎么样?
  16. 【Stephen Boyd】【1994】系统与控制理论中的线性矩阵不等式
  17. 《变形金刚4》将如期上映 植入广告无孔不入
  18. 手把手教你做一个jsp servlet mysql实现的学生签到考勤请假管理系统附带视频开发教程和完整源码
  19. 利用Python进行数据分析:数据规整(基于DataFrame)
  20. Android audio介绍

热门文章

  1. 差分隐私 机器学习_满足差分隐私的经验误差最小化方法
  2. java mybatis enum_mybatis处理枚举类的简单方法
  3. java安全接口调用_步骤3:调用Java接口
  4. linux查看python环境变量_Linux中的Python环境变量
  5. pid调节软件_科学or艺术?——如何优化PID回路以实现最优性能
  6. 您必须在sources.list中指定代码源_python如何从源代码构建lxml
  7. 详解Jedis连接池报错处理
  8. 让数据为你带来无限可能性
  9. OCIEnvCreate failed with return code -1 but error message text was not available with ODP.net
  10. 【Android】显示Emoji表情字符