剑指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 18 Java/Android
详解java如何集成swagger组件
Jun 21 Java/Android
Java并发编程之详解CyclicBarrier线程同步
Jun 23 Java/Android
Springboot使用Spring Data JPA实现数据库操作
Jun 30 Java/Android
spring boot项目application.properties文件存放及使用介绍
Jun 30 Java/Android
解析探秘fescar分布式事务实现原理
Feb 28 Java/Android
Java字符串逆序方法详情
Mar 21 Java/Android
SpringCloud Function SpEL注入漏洞分析及环境搭建
Apr 08 Java/Android
零基础学java之循环语句的使用
Apr 10 Java/Android
Android开发EditText禁止输入监听及InputFilter字符过滤
Jun 10 Java/Android
MyBatis XPathParser解析器使用范例详解
Jul 15 Java/Android
Mybatis 一级缓存和二级缓存原理区别
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
实例详解PHP中html word 互转的方法
2016/01/28 PHP
php结合web uploader插件实现分片上传文件
2016/05/10 PHP
Laravel中批量赋值Mass-Assignment的真正含义详解
2017/09/29 PHP
Yii2语言国际化自动配置详解
2018/08/22 PHP
JavaScript页面刷新与弹出窗口问题的解决方法
2010/03/02 Javascript
JavaScript 面向对象的之私有成员和公开成员
2010/05/04 Javascript
jquery动画4.升级版遮罩效果的图片走廊--带自动运行效果
2012/08/24 Javascript
js实现右下角可关闭最小化div(可用于展示推荐内容)
2013/06/24 Javascript
基于AngularJS实现页面滚动到底自动加载数据的功能
2015/10/16 Javascript
利用jquery制作滚动到指定位置触发动画
2016/03/26 Javascript
JQuery异步加载PartialView的方法
2016/06/07 Javascript
BootStrap.css 在手机端滑动时右侧出现空白的原因及解决办法
2016/06/07 Javascript
jQuery插入节点和移动节点用法示例(insertAfter、insertBefore方法)
2016/09/08 Javascript
web前端vue之CSS过渡效果示例
2018/01/10 Javascript
微信小程序实现复选框效果
2018/12/28 Javascript
每天学点Vue源码之vm.$mount挂载函数
2019/03/11 Javascript
Vue中props的详解
2019/05/16 Javascript
python 字符串split的用法分享
2013/03/23 Python
机器学习经典算法-logistic回归代码详解
2017/12/22 Python
Python实现判断字符串中包含某个字符的判断函数示例
2018/01/08 Python
Pandas删除数据的几种情况(小结)
2019/06/21 Python
Pycharm Available Package无法显示/安装包的问题Error Loading Package List解决
2020/09/18 Python
html5设计原理(推荐收藏)
2014/05/17 HTML / CSS
手对手的教你用canvas画一个简单的海报的方法示例
2018/12/10 HTML / CSS
Bootstrap File Input文件上传组件
2020/12/01 HTML / CSS
巴西最大的在线约会网站:ParPerfeito
2018/07/11 全球购物
局部内部类是否可以访问非final变量?
2013/04/20 面试题
《云房子》教学反思
2014/04/20 职场文书
电子商务求职信
2014/06/15 职场文书
教师纪念9.18事件演讲稿范文
2014/09/14 职场文书
机关作风建设工作总结
2014/10/23 职场文书
酒店销售经理岗位职责
2015/04/02 职场文书
新学期新寄语,献给新生们!
2019/11/15 职场文书
python tkinter实现定时关机
2021/04/21 Python
电脑无法安装Windows 11怎么办?无法安装Win11的解决方法
2021/11/21 数码科技
Github 使用python对copilot做些简单使用测试
2022/04/14 Python