热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

输入一个数组构建一颗二叉树,并且找出二叉树两个节点的最近公共祖先

packageorg.example;***Copyright(C),2019-2021*authorcandy_chen*date20218819:05**Classnamete

package org.example;/*** Copyright (C), 2019-2021* author candy_chen* date 2021/8/8 19:05** @Classname test* Description: 测试*/import org.junit.Test;import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;/****/public class Foo{class TreeNode {int value;TreeNode left;TreeNode right;public TreeNode(int value) {this.value &#61; value;}}/*** 指定节点位头结点构建二叉树* &#64;param array* &#64;param index* &#64;return*/private TreeNode createBinaryTreeByArray(int[] array, int index) {TreeNode tn &#61; null;if (index<array.length) {int value &#61; array[index];tn &#61; new TreeNode(value);tn.left &#61; createBinaryTreeByArray(array, 2*index&#43;1);tn.right &#61; createBinaryTreeByArray(array, 2*index&#43;2);return tn;}return tn;}TreeNode root;public TreeNode BinaryTree(int[] array) {return root &#61; createBinaryTreeByArray(array, 0);}/*** 数组的中点构建二叉树* &#64;param array* &#64;return*/public TreeNode arraybuildTree(int[] array) {if (array.length &#61;&#61; 0) {return null;}TreeNode root &#61; buildTree(array, 0, array.length-1);return root;}private TreeNode buildTree(int[] array, int start, int end) {if (start > end) {return null;}int mid &#61; start &#43; (end - start) / 2;TreeNode root &#61; new TreeNode(array[mid]);root.left &#61; buildTree(array, start, mid-1);root.right &#61; buildTree(array, mid &#43; 1, end);return root;}/*** 二叉树的最近公共祖先* 非递归实现*/Map<Integer, TreeNode> parent &#61; new HashMap<Integer, TreeNode>();Set<Integer> visited &#61; new HashSet<Integer>();public void dfs(TreeNode root) {if (root.left !&#61; null) {parent.put(root.left.value, root);dfs(root.left);}if (root.right !&#61; null) {parent.put(root.right.value, root);dfs(root.right);}}public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {dfs(root);while (p !&#61; null) {visited.add(p.value);p &#61; parent.get(p.value);}while (q !&#61; null) {if (visited.contains(q.value)) {return q;}q &#61; parent.get(q.value);}return null;}//测试&#64;Testpublic void test() {TreeNode root &#61; arraybuildTree(new int[]{1, 2, 3, 4, 5, 6, 7});TreeNode treeNode &#61; lowestCommonAncestor(root, new TreeNode(3), new TreeNode(7));System.out.println(treeNode.value);}}


推荐阅读
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • importjava.util.ArrayList;publicclassPageIndex{privateintpageSize;每页要显示的行privateintpageNum ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • 开源Keras Faster RCNN模型介绍及代码结构解析
    本文介绍了开源Keras Faster RCNN模型的环境需求和代码结构,包括FasterRCNN源码解析、RPN与classifier定义、data_generators.py文件的功能以及损失计算。同时提供了该模型的开源地址和安装所需的库。 ... [详细]
  • HashMap的相关问题及其底层数据结构和操作流程
    本文介绍了关于HashMap的相关问题,包括其底层数据结构、JDK1.7和JDK1.8的差异、红黑树的使用、扩容和树化的条件、退化为链表的情况、索引的计算方法、hashcode和hash()方法的作用、数组容量的选择、Put方法的流程以及并发问题下的操作。文章还提到了扩容死链和数据错乱的问题,并探讨了key的设计要求。对于对Java面试中的HashMap问题感兴趣的读者,本文将为您提供一些有用的技术和经验。 ... [详细]
  • 本文介绍了在Android开发中使用软引用和弱引用的应用。如果一个对象只具有软引用,那么只有在内存不够的情况下才会被回收,可以用来实现内存敏感的高速缓存;而如果一个对象只具有弱引用,不管内存是否足够,都会被垃圾回收器回收。软引用和弱引用还可以与引用队列联合使用,当被引用的对象被回收时,会将引用加入到关联的引用队列中。软引用和弱引用的根本区别在于生命周期的长短,弱引用的对象可能随时被回收,而软引用的对象只有在内存不够时才会被回收。 ... [详细]
author-avatar
葉芯彤_613
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有