博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
lintcode: 中序遍历和后序遍历树构造二叉树
阅读量:6040 次
发布时间:2019-06-20

本文共 3116 字,大约阅读时间需要 10 分钟。

题目

根据中序遍历和后序遍历树构造二叉树

样例

给出树的中序遍历: [1,2,3] 和后序遍历: [1,3,2]

返回如下的树:

  2

 /  \

1    3

注意

你可以假设树中不存在相同数值的节点

解题

1.后序遍历最后一个结点就是根节点,根据这个根结点把中序遍历划分开来,同时也把后续遍历划分开来

2.递归就好了

程序感觉很简单不知道怎么写的,程序来源于

/** * Definition of TreeNode: * public class TreeNode { *     public int val; *     public TreeNode left, right; *     public TreeNode(int val) { *         this.val = val; *         this.left = this.right = null; *     } * } */  public class Solution {    /**     *@param inorder : A list of integers that inorder traversal of a tree     *@param postorder : A list of integers that postorder traversal of a tree     *@return : Root of a tree     */      private int findPosition(int[] arr, int start, int end, int key) {        int i;        for (i = start; i <= end; i++) {            if (arr[i] == key) {                return i;            }        }        return -1;    }    private TreeNode myBuildTree(int[] inorder, int instart, int inend,            int[] postorder, int poststart, int postend) {        if (instart > inend) {            return null;        }        TreeNode root = new TreeNode(postorder[postend]);        int position = findPosition(inorder, instart, inend, postorder[postend]);        root.left = myBuildTree(inorder, instart, position - 1,                postorder, poststart, poststart + position - instart - 1);        root.right = myBuildTree(inorder, position + 1, inend,                postorder, poststart + position - instart, postend - 1);        return root;    }    public TreeNode buildTree(int[] inorder, int[] postorder) {        if (inorder.length != postorder.length) {            return null;        }        return myBuildTree(inorder, 0, inorder.length - 1, postorder, 0, postorder.length - 1);    }}
Java Code

自己又实现了一遍,并加了注释

/** * Definition of TreeNode: * public class TreeNode { *     public int val; *     public TreeNode left, right; *     public TreeNode(int val) { *         this.val = val; *         this.left = this.right = null; *     } * } */  public class Solution {    /**     *@param inorder : A list of integers that inorder traversal of a tree     *@param postorder : A list of integers that postorder traversal of a tree     *@return : Root of a tree     */    public TreeNode buildTree(int[] inorder, int[] postorder) {        // write your code here        if(inorder.length != postorder.length)            return null;        return buildTree(inorder,0,inorder.length -1 ,postorder,0,postorder.length -1 );    }    public int findroot(int[] inorder,int r){        for(int i=0;i
iend) return null; int r = postorder[pend]; // 跟结点 TreeNode root = new TreeNode(r); // 找到根节点 int l = findroot(inorder,r); // 左子树 中序遍历 起始结束位置以此是:istart l-1 //后序遍历 起始位置是:pstart 结束位置:pstart(已经占据了一个位置所以要-1) + (左子树的长度) - 1 root.left = buildTree(inorder,istart,l-1,postorder,pstart,pstart+(l-1 - istart + 1) -1); // 右子树 中序遍历 起始结束位置:l+1 iend // 后序遍历 起始位置:pstart + (左子树的长度) ,结束位置 pend -1 root.right = buildTree(inorder,l+1,iend,postorder,pstart + (l-1-istart+1),pend -1); return root; }}

 

转载地址:http://ssrhx.baihongyu.com/

你可能感兴趣的文章
分布式锁与实现(一)——基于Redis实现
查看>>
RDLC报表显示图片
查看>>
用查表查找汉字笔画
查看>>
top高级技能
查看>>
两张表先各自左外连接,然后在相互左外连接查找省市县的数据(业务需求必须这样做,省市去的是第一张表,而市县取的是第二张表,两张表中间通过市的名字连接)...
查看>>
sso单点登录,单点登录原理图,单点登录图解,单点登录
查看>>
原码、反码、补码的正(nao)确(can)打开方式
查看>>
《算法导论》
查看>>
ResourceBundle.getBundle方法demo
查看>>
基于Dubbo的http自动测试工具分享
查看>>
[linux] C语言Linux系统编程-TCP通信的11种状态
查看>>
{head first} --- networking 3
查看>>
SpringCloud入门之YAML格式文件规范学习
查看>>
深入理解Dalvik虚拟机- 解释器的执行机制
查看>>
android------2018 年初值得关注的 16 个新 Android 库和项目
查看>>
Mac eclipse 连接安卓手机调试 adb
查看>>
国际巨头互联网公司一些运营与管理思路
查看>>
数据库~Mysql里的Explain说明
查看>>
linux arm的存储分布那些事之一【转】
查看>>
跨域详解
查看>>