当前位置: 首页 > news >正文

LeetCode -- Construct Binary Tree from Inorder and Postorder Traversal

题目描述:


Given inorder and postorder traversal of a tree, construct the binary tree.


Note:
You may assume that duplicates do not exist in the tree.




就是输入中序遍历(左右中)和后序遍历(左右中)序列,生成二叉树。


思路:


设iFrom, iTo 分别inorder的起始和终止索引; pFrom ,pTo为递归过程中postorder的起始和终止索引。


1. 每次取后序遍历的最后节点,作为当前根节点,即current = new TreeNode(postorder[len - 1])
2. 从inorder序列中找到postorder[len-1]的索引,记为index
3. 创建左子树: inorder的索引范围:[0,index) , postorder的索引范围:[pFrom, pFrom + 距离(index, iFrom) - 1)。
4. 创建右子树: inorder的索引范围: [index + 1, len), postorder 的索引范围: [pFrom + 距离(index, iFrom), pTo-1]。


终止条件:pFrom > pTo 或iFrom > iTo






实现代码:




/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     public int val;
 *     public TreeNode left;
 *     public TreeNode right;
 *     public TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    
public TreeNode BuildTree(int[] inorder, int[] postorder) 
{
	TreeNode node = null;
	var len = postorder.Length - 1;
	Build(ref node, inorder, 0, len, postorder, 0, len);
	
	return node;
}


private void Build(ref TreeNode current, int [] inorder, int iFrom, int iTo, int[] postorder, int pFrom, int pTo)
{
	if(iFrom > iTo || pFrom > pTo){
		return;
	}
	
	// set current
	current = new TreeNode(postorder[pTo]);
	
	// take the last one from post order , because it is the root
	var pLast = postorder[pTo];
	
	// find its index in inorder
	var index = -1;
	for(var i = iFrom;i <= iTo; i++){
		if(inorder[i] == pLast){
			index = i;
			break;
		}
	}
	
	// for left sub tree , inorder : [0, index) . postorder : [pFrom, pFrom + distance(index, iFrom) - 1)
	Build(ref current.left, inorder, iFrom, index - 1, postorder, pFrom, pFrom + index - iFrom - 1);


	// for right sub tree , inorder : [index + 1, len), postorder : [pFrom + distance(index, iFrom), pTo-1]
	Build(ref current.right, inorder, index + 1, iTo ,postorder, pFrom + index - iFrom, pTo - 1);
}


	
}


相关文章:

  • 王小云:十年破译五部顶级密码
  • LeetCode -- Factorial Trailing Zeroes
  • LeetCode -- Gas Station
  • 山东大学王小云教授成功破解MD5
  • LeetCode -- Implement Trie (Prefix Tree)
  • 2009年的3G上网卡市场,华为将会领跑
  • LeetCode -- Kth Smallest Element in a BST
  • SQL2005CLR函数扩展-环比计算
  • LeetCode -- Majority Element
  • LeetCode -- Max Points on a Line
  • ArcGIS Server Java ADF 案例教程 17
  • LeetCode -- Maximal Square
  • ArcGIS Server Java ADF 案例教程 18
  • LeetCode -- Summary Ranges
  • ArcGIS Server Java ADF 案例教程 19
  • 网络传输文件的问题
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • 4个实用的微服务测试策略
  • Android单元测试 - 几个重要问题
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • DOM的那些事
  • HTTP中的ETag在移动客户端的应用
  • JavaWeb(学习笔记二)
  • Java方法详解
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • SpringBoot 实战 (三) | 配置文件详解
  • vue的全局变量和全局拦截请求器
  • 从输入URL到页面加载发生了什么
  • 订阅Forge Viewer所有的事件
  • 构建工具 - 收藏集 - 掘金
  • 欢迎参加第二届中国游戏开发者大会
  • 基于Android乐音识别(2)
  • 技术胖1-4季视频复习— (看视频笔记)
  • 前端相关框架总和
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • (2)STM32单片机上位机
  • (4)STL算法之比较
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (超详细)语音信号处理之特征提取
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (一)Neo4j下载安装以及初次使用
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (转)JAVA中的堆栈
  • (转载)从 Java 代码到 Java 堆
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .net连接oracle数据库
  • @SuppressWarnings(unchecked)代码的作用
  • @vue/cli脚手架