树的算法 已知二叉树的前序序列和中序序列求解树
2015-10-23 16:02
267 查看
题目: 已知二叉树的前序序列和中序序列求解树
比如
6
4 8
3 5 7
前序序列为6,4,3,5,8,7
中序序列为3,4,5,6,7,8
思路: 前序遍历序列的第一个元素必为根节点 则中序遍历序列中,该节点之前的为左子树,该节点之后的为右子树,若该节点之前没有节点,则左子树为空,反之右子树为空,
截取个子树的前序和中序序列,重复上述逻辑递归求解
我自己的思路是只根据前序遍历序列也可得到:同理前序第一个元素为根节点,向后依次比较后续元素,直到找到第一个比根元素大的,则该元素与根元素之间的所有元素(不包括)为左子树,该元素之后的所有元素(包括)为右子树,对子树使用相同逻辑递归即可,但需要判断子树为空的情况
比如
6
4 8
3 5 7
前序序列为6,4,3,5,8,7
中序序列为3,4,5,6,7,8
思路: 前序遍历序列的第一个元素必为根节点 则中序遍历序列中,该节点之前的为左子树,该节点之后的为右子树,若该节点之前没有节点,则左子树为空,反之右子树为空,
截取个子树的前序和中序序列,重复上述逻辑递归求解
我自己的思路是只根据前序遍历序列也可得到:同理前序第一个元素为根节点,向后依次比较后续元素,直到找到第一个比根元素大的,则该元素与根元素之间的所有元素(不包括)为左子树,该元素之后的所有元素(包括)为右子树,对子树使用相同逻辑递归即可,但需要判断子树为空的情况
package com.rui.microsoft; import java.util.Arrays; public class Tree_BuildTreeByPreMid { public static void main(String[] args) { int[] pre = {6,4,3,5,8,7}; //int[] mid = {3,4,5,6,7,8}; Node root = Tree_BuildTreeByPreMid.build(pre); System.out.println(root.value); } public static Node build(int[] pre){ int rootV = pre[0]; Node root = new Node(rootV); int left = 1; while(left < pre.length && pre[left] < rootV) left++; //No left tree, because the pointer left has not changed if(left == 1){ root.left = null; }else{ int[] leftArray = Arrays.copyOfRange(pre, 1, left); root.left = build(leftArray); } //No right tree, because the pointer left has been moved to the end of the array if(left == pre.length){ root.right = null; }else{ int[] rightArray = Arrays.copyOfRange(pre, left, pre.length); root.right = build(rightArray); } return root; } static class Node { int value; Node left; Node right; public Node(int v){ this.value = v; } } }
相关文章推荐
- mysql去除内容中的换行和回车
- arm-linux-gcc 编译器的安装
- 安卓顶部tab导航栏的实现
- java实现文件及目录压缩
- 最新版Android Sdk版本和API版本对应
- ajax返回json格式 报500 Internal Server Error
- 错误集
- 定时任务(每5分钟执行一次各机房访问接口)
- 将博客搬至CSDN
- 单断言VS多断言
- [国嵌笔记][032][异常向量表]
- 简明 Vim 练级攻略(转)
- LeetCode[Math]----Pow(x, n)
- Java分块下载的客户端和服务器的实现
- 海康多视频监控
- Android应用程序签名详解
- 使用静态函数的好处
- 9.png为什么可以保证图片不失真,.9.png操作详解————针对原文有补充
- sqlserver获取其中所有表的名称
- js闭包学习感悟笔记