剑指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 相关文章推荐
Java实现多文件上传功能
Jun 30 Java/Android
Java基础之详解HashSet的使用方法
Jun 30 Java/Android
分析ZooKeeper分布式锁的实现
Jun 30 Java/Android
Android自定义scrollview实现回弹效果
Apr 01 Java/Android
Dubbo+zookeeper搭配分布式服务的过程详解
Apr 03 Java/Android
Java后端 Dubbo retries 超时重试机制的解决方案
Apr 14 Java/Android
Android在Sqlite3中的应用及多线程使用数据库的建议
Apr 24 Java/Android
Mybatis-Plus 使用 @TableField 自动填充日期
Apr 26 Java/Android
Java 异步任务计算FutureTask
Apr 28 Java/Android
SpringCloud中分析讲解Feign组件添加请求头有哪些坑梳理
Jun 21 Java/Android
Java多线程并发FutureTask使用详解
Jun 28 Java/Android
SpringBoot接入钉钉自定义机器人预警通知
Jul 15 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
资料注册后发信小技巧
2006/10/09 PHP
PHP Socket 编程
2010/04/09 PHP
php程序的国际化实现方法(利用gettext)
2011/08/14 PHP
PHP调用VC编写的COM组件实例
2014/03/29 PHP
php 输出json及显示json中的中文汉字详解及实例
2016/11/09 PHP
Jquery插件 easyUI属性汇总
2011/01/19 Javascript
JS中如何设置readOnly的值
2013/12/25 Javascript
Jquery中Event对象属性小结
2015/02/27 Javascript
jquery popupDialog 使用 加载jsp页面的方法
2016/10/25 Javascript
Bootstrap源码解读模态弹出框(11)
2016/12/28 Javascript
Bootstrap按钮组实例详解
2017/07/03 Javascript
深入研究jQuery图片懒加载 lazyload.js使用方法
2017/08/16 jQuery
使用JS实现气泡跟随鼠标移动的动画效果
2017/09/16 Javascript
vue.js,ajax渲染页面的实例
2018/02/11 Javascript
react中实现搜索结果中关键词高亮显示
2018/07/31 Javascript
基于javascript处理nginx请求过程详解
2020/07/07 Javascript
[01:18:21]EG vs TNC Supermajor小组赛B组败者组第一轮 BO3 第一场 6.2
2018/06/03 DOTA
Python映射拆分操作符用法实例
2015/05/19 Python
Tensorflow环境搭建的方法步骤
2018/02/07 Python
解决matplotlib库show()方法不显示图片的问题
2018/05/24 Python
基于Django的乐观锁与悲观锁解决订单并发问题详解
2019/07/31 Python
flask实现验证码并验证功能
2019/12/05 Python
PyTorch 普通卷积和空洞卷积实例
2020/01/07 Python
python GUI库图形界面开发之PyQt5时间控件QTimer详细使用方法与实例
2020/02/26 Python
完美解决pyinstaller打包报错找不到依赖pypiwin32或pywin32-ctypes的错误
2020/04/01 Python
Python3爬虫中关于Ajax分析方法的总结
2020/07/10 Python
用纯css3实现的图片放大镜特效效果非常不错
2014/09/02 HTML / CSS
canvas绘制视频封面的方法
2018/02/05 HTML / CSS
BONIA官方网站:国际奢侈品牌和皮革专家
2016/11/27 全球购物
Parfumdreams芬兰:购买香水和化妆品
2021/02/13 全球购物
股权转让协议书范本
2014/04/12 职场文书
抽样调查项目计划书
2014/04/24 职场文书
2015年端午节活动方案
2015/05/05 职场文书
运动会宣传稿100字
2015/07/23 职场文书
Java Kafka 消费积压监控的示例代码
2021/07/01 Java/Android
python实现双向链表原理
2022/05/25 Python