剑指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实现异步事件驱动的方法
Jun 28 Java/Android
Java网络编程之UDP实现原理解析
Sep 04 Java/Android
java多态注意项小结
Oct 16 Java/Android
Java后端 Dubbo retries 超时重试机制的解决方案
Apr 14 Java/Android
Java由浅入深通关抽象类与接口(下篇)
Apr 26 Java/Android
SpringBoot使用AOP实现统计全局接口访问次数详解
Jun 16 Java/Android
Android实现图片九宫格
Jun 28 Java/Android
tree shaking对打包体积优化及作用
Jul 07 Java/Android
向Spring IOC 容器动态注册bean实现方式
Jul 15 Java/Android
Spring Boot 的创建和运行示例代码详解
Jul 23 Java/Android
Spring boot实现上传文件到本地服务器
Aug 14 Java/Android
Java中的Kafka为什么性能这么快及4大核心详析
Sep 23 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
mysql limit查询优化分析
2008/11/12 PHP
IP攻击升级,程序改进以对付新的攻击
2010/11/23 PHP
WordPress免插件实现面包屑导航的示例代码
2020/08/20 PHP
jquery里的each使用方法详解
2010/12/22 Javascript
jQuery数据显示插件整合实现代码
2011/10/24 Javascript
jQuery实现div拖拽效果实例分析
2016/02/20 Javascript
mvc中form表单提交的三种方式(推荐)
2016/08/10 Javascript
微信小程序 wxapp画布 canvas详细介绍
2016/10/31 Javascript
jQuery实现下拉菜单的实例代码
2017/06/19 jQuery
vue.js中toast用法及使用toast弹框的实例代码
2018/08/27 Javascript
JS中的函数与对象的创建方式
2019/05/12 Javascript
js实现前端界面导航栏下拉列表
2020/08/27 Javascript
js实现自定义滚动条的示例
2020/10/27 Javascript
[39:52]2018DOTA2亚洲邀请赛 4.3 突围赛 EG vs Newbee 第一场
2018/04/04 DOTA
跟老齐学Python之赋值,简单也不简单
2014/09/24 Python
PYTHON压平嵌套列表的简单实现
2016/06/08 Python
深入解析Python中的__builtins__内建对象
2016/06/21 Python
Python 稀疏矩阵-sparse 存储和转换
2017/05/27 Python
python语音识别实践之百度语音API
2018/08/30 Python
python 读取鼠标点击坐标的实例
2018/12/29 Python
Python3按一定数据位数格式处理bin文件的方法
2019/01/24 Python
浅谈cv2.imread()和keras.preprocessing中的image.load_img()区别
2020/06/12 Python
享誉全球的多元化时尚精品购物平台:Farfetch发发奇(支持中文)
2017/08/08 全球购物
商场总经理岗位职责
2014/02/03 职场文书
大学生职业生涯规划书参考模板
2014/03/05 职场文书
十八届三中全会感言
2014/03/10 职场文书
学生党员公开承诺书
2014/05/28 职场文书
2014年银行年终工作总结
2014/12/19 职场文书
圆明园观后感
2015/06/03 职场文书
中秋节随笔
2015/08/15 职场文书
2020年基层司法所建设情况调研报告
2019/11/30 职场文书
SQL SERVER中常用日期函数的具体使用
2021/04/08 SQL Server
Java实现多文件上传功能
2021/06/30 Java/Android
多人盗宝《绿林侠盗》第三赛季4.5上线 跨平台实装
2022/04/03 其他游戏
GoFrame gredis缓存DoVar Conn连接对象 自动序列化GoFrame gredisDo/DoVar方法Conn连接对象自动序列化/反序列化总结
2022/06/14 Golang