算法-从先序遍历还原二叉树
题目:
我们从二叉树的根节点 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/
算法-从先序遍历还原二叉树相关推荐
- leetcode 题库1028--从先序遍历还原二叉树
从先序遍历还原二叉树 我们从二叉树的根节点 root 开始进行深度优先搜索. 在遍历中的每个节点处,我们输出 D 条短划线(其中 D 是该节点的深度),然后输出该节点的值.(如果节点的深度为 D,则其 ...
- 数据结构基础 后序遍历和中序遍历还原二叉树
[问题描写叙述] 二叉树 A / / B C / / / / D E F G ...
- js怎么取到遍历中的特定值_LeetCode 1028 hard 从先序遍历还原二叉树 Python解题记录...
我们在该专栏中记录了我俩的刷题记录. 我们更新的所有题目都在目录中. 今天的题目是 力扣leetcode-cn.com 题目 We run a preorder depth first search ...
- leetcode1028. 从先序遍历还原二叉树(dfs/栈)
我们从二叉树的根节点 root 开始进行深度优先搜索. 在遍历中的每个节点处,我们输出 D 条短划线(其中 D 是该节点的深度),然后输出该节点的值.(如果节点的深度为 D,则其直接子节点的深度为 D ...
- 每天一道LeetCode-----根据先序遍历和中序遍历还原二叉树
Construct Binary Tree from Preorder and Inorder Traversal 原题链接Construct Binary Tree from Preorder an ...
- C++ 先序遍历还原二叉树
输入数组,数组中为树先序遍历结果,空节点值为-1 Node* createTree(vector<int> nums, int &pos) {int n = nums.size() ...
- leetcode算法题--从先序遍历还原二叉树
原题链接:https://leetcode-cn.com/problems/recover-a-tree-from-preorder-traversal/ 迭代 + 栈 TreeNode* recov ...
- LeetCode 1028. 从先序遍历还原二叉树(栈)
文章目录 1. 题目 2. 栈解题 1. 题目 我们从二叉树的根节点 root 开始进行深度优先搜索. 在遍历中的每个节点处,我们输出 D 条短划线(其中 D 是该节点的深度),然后输出该节点的值.( ...
- Leetcode--1028. 从先序遍历还原二叉树(Java)
我们从二叉树的根节点 root 开始进行深度优先搜索. 在遍历中的每个节点处,我们输出 D 条短划线(其中 D 是该节点的深度),然后输出该节点的值.(如果节点的深度为 D,则其直接子节点的深度为 D ...
最新文章
- ADC的有效位数和信纳比计算
- 同步两个数据库的结构或者数据
- python编程入门经典实例-【python】编程语言入门经典100例--30
- jquery实现滚动条滚动到一定高度导航固定不变
- 基于easyui开发Web版Activiti流程定制器详解(六)——Draw2d详解(二)
- 一维战舰(51Nod-1521)
- mac python安装第三方库jupyter_Mac搭建jupyter环境
- CSS基础——定位 (position)【学习笔记】
- unity播放视频代码
- vs2010专业版下载链接
- codewars题目解答Multiples of 3 or 5
- 典型用户和用户场景描述
- ABAQUS中inp文件的使用和书写
- c4droid用c语言画爱心,【图片】[自学C语言第五天]发一个作品【c4droid吧】_百度贴吧...
- 计算机er保研选网络安全方向怎么样?
- 【Stephen Boyd】【1994】系统与控制理论中的线性矩阵不等式
- 《变形金刚4》将如期上映 植入广告无孔不入
- 手把手教你做一个jsp servlet mysql实现的学生签到考勤请假管理系统附带视频开发教程和完整源码
- 利用Python进行数据分析:数据规整(基于DataFrame)
- Android audio介绍
热门文章
- 差分隐私 机器学习_满足差分隐私的经验误差最小化方法
- java mybatis enum_mybatis处理枚举类的简单方法
- java安全接口调用_步骤3:调用Java接口
- linux查看python环境变量_Linux中的Python环境变量
- pid调节软件_科学or艺术?——如何优化PID回路以实现最优性能
- 您必须在sources.list中指定代码源_python如何从源代码构建lxml
- 详解Jedis连接池报错处理
- 让数据为你带来无限可能性
- OCIEnvCreate failed with return code -1 but error message text was not available with ODP.net
- 【Android】显示Emoji表情字符