剑指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 相关文章推荐
Maven学习----Maven安装与环境变量配置教程
Jun 29 Java/Android
看完这篇文章获得一些java if优化技巧
Jul 15 Java/Android
java设计模式--三种工厂模式详解
Jul 21 Java/Android
logback如何自定义日志存储
Aug 30 Java/Android
MyBatis-Plus 批量插入数据的操作方法
Sep 25 Java/Android
Spring中的使用@Async异步调用方法
Nov 01 Java/Android
Spring Boot接口定义和全局异常统一处理
Apr 20 Java/Android
Java设计模式中的命令模式
Apr 28 Java/Android
解决Springboot PostMapping无法获取数据的问题
May 06 Java/Android
Android中的Launch Mode详情
Jun 05 Java/Android
解决spring.thymeleaf.cache=false不起作用的问题
Jun 10 Java/Android
Spring中bean集合注入的方法详解
Jul 07 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
不支持fsockopen但支持culr环境下下ucenter与modoer通讯问题
2011/08/12 PHP
php daddslashes()和 saddslashes()有哪些区别分析
2012/10/26 PHP
PHP中mb_convert_encoding与iconv函数的深入解析
2013/06/21 PHP
XAMPP安装与使用方法详细解析
2013/11/27 PHP
Laravel 5框架学习之Blade 简介
2015/04/08 PHP
PHP实现上传图片到 zimg 服务器
2016/10/19 PHP
PHP封装XML和JSON格式数据接口操作示例
2019/03/06 PHP
JQuery制作的放大效果的popup对话框(未添加任何jquery plugin)分享
2013/04/28 Javascript
jquery实现的下拉和收缩效果示例
2014/08/21 Javascript
js点击button按钮跳转到另一个新页面
2014/10/10 Javascript
jQuery获取上传文件的名称的正则表达式
2015/05/21 Javascript
chrome调试javascript详解
2015/10/21 Javascript
JavaScript实现给定时间相加天数的方法
2016/01/25 Javascript
详解Wondows下Node.js使用MongoDB的环境配置
2016/03/01 Javascript
浅析在javascript中创建对象的各种模式
2016/05/06 Javascript
jquery实现左右无缝轮播图
2020/07/31 Javascript
JS实现拖拽的方法分析
2016/12/20 Javascript
微信小程序支付功能 php后台对接完整代码分享
2018/06/12 Javascript
Vue 页面状态保持页面间数据传输的一种方法(推荐)
2018/11/01 Javascript
原生JS无缝滑动轮播图
2019/10/22 Javascript
python处理大数字的方法
2015/05/27 Python
python实现的文件同步服务器实例
2015/06/02 Python
Python3中详解fabfile的编写
2018/06/24 Python
Pyqt5实现英文学习词典
2019/06/24 Python
python实现一次性封装多条sql语句(begin end)
2020/06/06 Python
Python操作word文档插入图片和表格的实例演示
2020/10/25 Python
使用CSS3在触屏上为按钮实现激活效果
2013/09/27 HTML / CSS
css3实现3d旋转动画特效
2015/03/10 HTML / CSS
详解CSS3媒体查询响应式布局bootstrap 框架原理实战(推荐)
2020/11/16 HTML / CSS
路德维希•贝克(LUDWIG BECK)中文官网:德国大型美妆百货
2020/09/19 全球购物
酒店门卫岗位职责
2013/12/29 职场文书
中秋节主持词
2014/04/02 职场文书
大学生就业自我推荐信
2014/05/10 职场文书
物业管理委托协议(2篇)
2014/09/23 职场文书
助学金感谢信
2015/01/20 职场文书
Spring Bean的实例化之属性注入源码剖析过程
2021/06/13 Java/Android