剑指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集成Redis,并自定义对象序列化操作
Jun 22 Java/Android
Java并发编程之详解CyclicBarrier线程同步
Jun 23 Java/Android
IDEA使用SpringAssistant插件创建SpringCloud项目
Jun 23 Java/Android
Netty结合Protobuf进行编解码的方法
Jun 26 Java/Android
解决Swagger2返回map复杂结构不能解析的问题
Jul 02 Java/Android
SpringBoot+VUE实现数据表格的实战
Aug 02 Java/Android
OpenCV实现普通阈值
Nov 17 Java/Android
Java中API的使用方法详情
Apr 06 Java/Android
Java中的继承、多态以及封装
Apr 11 Java/Android
mybatis 获取更新记录的id
May 20 Java/Android
Java中的Kotlin 内部类原理
Jun 16 Java/Android
volatile保证可见性及重排序方法
Aug 05 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来实现网络服务
2009/09/15 PHP
163的邮件用phpmailer发送(实例详解)
2013/06/24 PHP
php+ajax实现无刷新动态加载数据技术
2015/04/28 PHP
WordPress中用于更新伪静态规则的PHP代码实例讲解
2015/12/18 PHP
PHP中抽象类,接口功能、定义方法示例
2019/02/26 PHP
理解Javascript_13_执行模型详解
2010/10/20 Javascript
js播放wav文件(源码)
2013/04/22 Javascript
node.js 动态执行脚本
2016/06/02 Javascript
浅谈JavaScript的内置对象和浏览器对象
2016/06/03 Javascript
谈谈JavaScript的New关键字
2016/08/26 Javascript
JS字符串按逗号和回车分隔的方法
2017/04/25 Javascript
JavaScript输入框字数实时统计更新
2017/06/17 Javascript
AjaxFileUpload.js实现异步上传文件功能
2019/04/19 Javascript
JavaScript页面倒计时功能完整示例
2019/05/15 Javascript
详解vue-property-decorator使用手册
2019/07/29 Javascript
vue 使用element-ui中的Notification自定义按钮并实现关闭功能及如何处理多个通知
2019/08/17 Javascript
el-form 多层级表单的实现示例
2020/09/10 Javascript
详解如何使用React Hooks请求数据并渲染
2020/10/18 Javascript
python smtplib模块发送SSL/TLS安全邮件实例
2015/04/08 Python
windows系统下Python环境搭建教程
2017/03/28 Python
python+matplotlib绘制饼图散点图实例代码
2018/01/20 Python
Python实现压缩文件夹与解压缩zip文件的方法
2018/09/01 Python
Python实现UDP程序通信过程图解
2020/05/15 Python
网页布局中CSS样式无效的十个重要原因详解
2017/08/10 HTML / CSS
CSS3结构性伪类选择器九种写法
2012/04/18 HTML / CSS
HTML5 解析规则分析
2009/08/14 HTML / CSS
HTML5中meta属性的使用方法
2016/02/29 HTML / CSS
html5 postMessage解决跨域、跨窗口消息传递方案
2016/12/20 HTML / CSS
效能风暴心得体会
2014/09/04 职场文书
2015年重阳节慰问信
2015/03/23 职场文书
看雷锋电影观后感
2015/06/10 职场文书
优秀学生主要事迹怎么写
2015/11/04 职场文书
2016年“六一儿童节”校园广播稿
2015/12/17 职场文书
Mysql 如何查询时间段交集
2021/06/08 MySQL
python中使用 unittest.TestCase单元测试的用例详解
2021/08/30 Python
德劲DE1105机评
2022/04/05 无线电