剑指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 相关文章推荐
Spring Data JPA的Audit功能审计数据库的变更
Jun 26 Java/Android
分析Java中Map的遍历性能问题
Jun 26 Java/Android
Java实现二维数组和稀疏数组之间的转换
Jun 27 Java/Android
解决MultipartFile.transferTo(dest) 报FileNotFoundExcep的问题
Jul 01 Java/Android
解析mybatis-plus中的resultMap简单使用
Nov 23 Java/Android
Netty分布式客户端接入流程初始化源码分析
Mar 25 Java/Android
mapstruct的用法之qualifiedByName示例详解
Apr 06 Java/Android
Java 超详细讲解hashCode方法
Apr 07 Java/Android
Spring Boot 使用 Spring-Retry 进行重试框架
Apr 24 Java/Android
Java实现带图形界面的聊天程序
Jun 10 Java/Android
Java Spring Boot请求方式与请求映射过程分析
Jun 25 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 高手之路(三)
2006/10/09 PHP
PHP无敌近乎加密方式!
2010/07/17 PHP
php eval函数用法 PHP中eval()函数小技巧
2012/10/31 PHP
基于php伪静态的实现详细介绍
2013/04/28 PHP
php全局变量和类配合使用深刻理解
2013/06/05 PHP
php单态设计模式(单例模式)实例
2014/11/18 PHP
php和nginx交互实例讲解
2019/09/24 PHP
一个js实现的所谓的滑动门
2007/05/23 Javascript
javascript 操作cookies及正确使用cookies的属性
2009/10/15 Javascript
javascript 带有滚动条的表格,标题固定,带排序功能.
2009/11/13 Javascript
javascript中的new使用
2010/03/20 Javascript
js onload处理html页面加载之后的事件
2013/10/30 Javascript
快速解决jQuery与其他库冲突的方法介绍
2014/01/02 Javascript
javascript 10进制和62进制的相互转换
2014/07/31 Javascript
浅谈JavaScript Date日期和时间对象
2014/12/29 Javascript
jQuery判断多个input file 都不能为空的例子
2015/06/23 Javascript
javascript实现网页子页面遍历回调的方法(涉及 window.frames、递归函数、函数上下文)
2015/07/27 Javascript
JS与HTML结合使用marquee标签实现无缝滚动效果代码
2016/07/05 Javascript
Vue.js中用webpack合并打包多个组件并实现按需加载
2017/02/17 Javascript
浅谈Angular7 项目开发总结
2018/12/19 Javascript
Javascript读写cookie的实例源码
2019/03/16 Javascript
微信小程序实现点击图片放大预览
2019/10/21 Javascript
node中短信api实现验证码登录的示例代码
2021/01/20 Javascript
Python多进程multiprocessing用法实例分析
2017/08/18 Python
基于Python os模块常用命令介绍
2017/11/03 Python
对json字符串与python字符串的不同之处详解
2018/12/19 Python
python将txt文档每行内容循环插入数据库的方法
2018/12/28 Python
python各类经纬度转换的实例代码
2019/08/08 Python
三个python爬虫项目实例代码
2019/12/28 Python
PyCharm Community安装与配置的详细教程
2020/11/24 Python
解决virtualenv -p python3 venv报错的问题
2021/02/05 Python
群众路线表态发言材料
2014/10/17 职场文书
2016继续教育研修日志
2015/11/13 职场文书
公司要求试用期员工提交“述职报告”,该怎么写?
2019/07/17 职场文书
在HTML5 localStorage中存储对象的示例代码
2021/04/21 Javascript
Python趣味挑战之给幼儿园弟弟生成1000道算术题
2021/05/28 Python