剑指Offer之Java算法习题精讲二叉树的构造和遍历


Posted in Java/Android onMarch 21, 2022

题目一

剑指Offer之Java算法习题精讲二叉树的构造和遍历

 解法

/** * Definition for a binary tree node. * public class TreeNode { *     int val; *     TreeNode left; *     TreeNode right; *     TreeNode() {} *     TreeNode(int val) { this.val = val; } *     TreeNode(int val, TreeNode left, TreeNode right) { *         this.val = val; *         this.left = left; *         this.right = right; *     } * } */class Solution {    public TreeNode constructMaximumBinaryTree(int[] nums) {        return method(nums,0,nums.length-1);    }    public TreeNode method(int[] nums,int lo,int hi){        if(lo>hi){            return null;        }        int index = -1;        int max = Integer.MIN_VALUE;        for(int i = lo;i<=hi;i++){            if(max<nums[i]){                max = nums[i];                index = i;            }        }        TreeNode root = new TreeNode(max);        root.left = method(nums,lo,index-1);        root.right = method(nums,index+1,hi);        return root;    }}

题目二

剑指Offer之Java算法习题精讲二叉树的构造和遍历

 解法

/** * Definition for a binary tree node. * public class TreeNode { *     int val; *     TreeNode left; *     TreeNode right; *     TreeNode() {} *     TreeNode(int val) { this.val = val; } *     TreeNode(int val, TreeNode left, TreeNode right) { *         this.val = val; *         this.left = left; *         this.right = right; *     } * } */class Solution {    public TreeNode buildTree(int[] preorder, int[] inorder) {        return method(preorder,0,preorder.length-1,inorder,0,inorder.length-1);    }    public TreeNode method(int[] preorder, int preLeft,int preEnd , int[] inorder,int inLeft,int inEnd){        if(preLeft>preEnd){            return null;        }        int rootVal = preorder[preLeft];        int index = -1;        for(int i = inLeft;i<=inEnd;i++){            if(rootVal == inorder[i]){                index = i;            }        }        TreeNode root = new TreeNode(rootVal);        int leftSize = index - inLeft;        root.left = method(preorder,preLeft+1,leftSize+preLeft,inorder,inLeft,index-1);        root.right = method(preorder,leftSize+preLeft+1,preEnd,inorder,index+1,inEnd);        return root;    }}

题目三

剑指Offer之Java算法习题精讲二叉树的构造和遍历

 解法

/** * Definition for a binary tree node. * public class TreeNode { *     int val; *     TreeNode left; *     TreeNode right; *     TreeNode() {} *     TreeNode(int val) { this.val = val; } *     TreeNode(int val, TreeNode left, TreeNode right) { *         this.val = val; *         this.left = left; *         this.right = right; *     } * } */class Solution {    public TreeNode buildTree(int[] inorder, int[] postorder) {        return build(inorder,0,inorder.length-1,postorder,0,postorder.length-1);    }    TreeNode build(int[] inorder, int inStart, int inEnd,int[] postorder, int postStart, int postEnd) {    if (inStart > inEnd) {        return null;    }    // root 节点对应的值就是后序遍历数组的最后一个元素    int rootVal = postorder[postEnd];    // rootVal 在中序遍历数组中的索引    int index = 0;    for (int i = inStart; i <= inEnd; i++) {        if (inorder[i] == rootVal) {            index = i;            break;        }    }    // 左子树的节点个数    int leftSize = index - inStart;    TreeNode root = new TreeNode(rootVal);    // 递归构造左右子树    root.left = build(inorder, inStart, index - 1,postorder, postStart, postStart + leftSize - 1);    root.right = build(inorder, index + 1, inEnd,postorder, postStart + leftSize, postEnd - 1);    return root;}}

题目四

剑指Offer之Java算法习题精讲二叉树的构造和遍历

 解法

/** * Definition for a binary tree node. * public class TreeNode { *     int val; *     TreeNode left; *     TreeNode right; *     TreeNode() {} *     TreeNode(int val) { this.val = val; } *     TreeNode(int val, TreeNode left, TreeNode right) { *         this.val = val; *         this.left = left; *         this.right = right; *     } * } */class Solution {    public TreeNode constructFromPrePost(int[] preorder, int[] postorder) {        return method(preorder,0,preorder.length-1,postorder,0,postorder.length-1);    }    public TreeNode method(int[] preorder,int preStart, int preEnd, int[] postorder,int postStart,int postEnd){        if(preStart>preEnd){            return null;        }        if(preStart==preEnd){            return new TreeNode(preorder[preStart]);        }        int rootVal = preorder[preStart];        int leftRootVal = preorder[preStart + 1];        int index = 0;        for (int i = postStart; i < postEnd; i++) {            if (postorder[i] == leftRootVal) {                index = i;                break;            }        }        TreeNode root = new TreeNode(rootVal);        int leftSize = index - postStart + 1;        root.left = method(preorder, preStart + 1, preStart + leftSize,postorder, postStart, index);        root.right = method(preorder, preStart + leftSize + 1, preEnd,postorder, index + 1, postEnd - 1);        return root;    }}

到此这篇关于剑指Offer之Java算法习题精讲二叉树的构造和遍历的文章就介绍到这了,更多相关Java 二叉树构造内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Java/Android 相关文章推荐
springboot @ConfigurationProperties和@PropertySource的区别
Jun 11 Java/Android
Java基础-封装和继承
Jul 02 Java/Android
Java使用jmeter进行压力测试
Jul 09 Java/Android
关于springboot 配置date字段返回时间戳的问题
Jul 25 Java/Android
SpringBoot SpringEL表达式的使用
Jul 25 Java/Android
Sleuth+logback 设置traceid 及自定义信息方式
Jul 26 Java/Android
Spring Security使用单点登录的权限功能
Apr 03 Java/Android
Spring Cloud Netflix 套件中的负载均衡组件 Ribbon
Apr 13 Java/Android
Android开发手册TextInputLayout样式使用示例
Jun 10 Java/Android
springboot集成redis存对象乱码的问题及解决
Jun 16 Java/Android
java.util.NoSuchElementException原因及两种解决方法
Jun 28 Java/Android
spring boot实现文件上传
Aug 14 Java/Android
剑指Offer之Java算法习题精讲二叉树专项训练
InterProcessMutex实现zookeeper分布式锁原理
springboot+zookeeper实现分布式锁
Mybatis-Plus进阶分页与乐观锁插件及通用枚举和多数据源详解
Mar 21 #Java/Android
Spring this调用当前类方法无法拦截的示例代码
SpringCloud Feign请求头删除修改的操作代码
Mar 20 #Java/Android
JavaWeb实现显示mysql数据库数据
You might like
PHP入门速成教程
2007/03/19 PHP
解析PHP处理换行符的问题 \r\n
2013/06/13 PHP
php代码审计比较有意思的例子
2014/05/07 PHP
PHP中十六进制颜色与RGB颜色值互转的方法
2019/03/18 PHP
确保Laravel网站不会被嵌入到其他站点中的方法
2019/10/18 PHP
php+iframe 实现上传文件功能示例
2020/03/04 PHP
javascript preload&amp;lazy load
2010/05/13 Javascript
JS、CSS加载中的小问题探讨
2013/11/26 Javascript
jQuery Trim去除字符串首尾空字符的实现方法说明
2014/02/11 Javascript
DOM基础教程之事件类型
2015/01/20 Javascript
nodeJs爬虫获取数据简单实现代码
2016/03/29 NodeJs
AngularJs实现分页功能不带省略号的代码
2016/05/30 Javascript
JS中递归函数
2016/06/17 Javascript
JS高仿抛物线加入购物车特效实现代码
2017/02/20 Javascript
Express进阶之log4js实用入门指南
2018/02/10 Javascript
vue-resource请求实现http登录拦截或者路由拦截的方法
2018/07/11 Javascript
layui按条件隐藏表格列的实例
2019/09/19 Javascript
vue点击按钮动态创建与删除组件功能
2019/12/29 Javascript
[14:51]DOTA2 HEROS教学视频教你分分钟做大人-卓尔游侠
2014/06/13 DOTA
python 字典(dict)按键和值排序
2016/06/28 Python
Python数据报表之Excel操作模块用法分析
2019/03/11 Python
python实现维吉尼亚算法
2019/03/20 Python
python创建属于自己的单词词库 便于背单词
2019/07/30 Python
Python数据结构dict常用操作代码实例
2020/03/12 Python
TensorFlow实现批量归一化操作的示例
2020/04/22 Python
python logging模块的使用
2020/09/07 Python
基于python实现复制文件并重命名
2020/09/16 Python
Html5无刷新修改browser Url的方法
2014/01/15 HTML / CSS
人事主管岗位职责范本
2013/12/04 职场文书
放飞蜻蜓反思
2014/02/05 职场文书
生产部厂长助理职位说明书
2014/03/03 职场文书
体育教师个人工作总结
2015/02/09 职场文书
师德承诺书2015
2015/04/28 职场文书
MySQL 慢查询日志深入理解
2021/04/22 MySQL
python 破解加密zip文件的密码
2021/04/22 Python
Python 线程池模块之多线程操作代码
2021/05/20 Python