热门标签 | 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);}}


推荐阅读
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 数组的排序:数组本身有Arrays类中的sort()方法,这里写几种常见的排序方法。(1)冒泡排序法publicstaticvoidmain(String[]args ... [详细]
  • 面向对象之3:封装的总结及实现方法
    本文总结了面向对象中封装的概念和好处,以及在Java中如何实现封装。封装是将过程和数据用一个外壳隐藏起来,只能通过提供的接口进行访问。适当的封装可以提高程序的理解性和维护性,增强程序的安全性。在Java中,封装可以通过将属性私有化并使用权限修饰符来实现,同时可以通过方法来访问属性并加入限制条件。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • 本文介绍了RxJava在Android开发中的广泛应用以及其在事件总线(Event Bus)实现中的使用方法。RxJava是一种基于观察者模式的异步java库,可以提高开发效率、降低维护成本。通过RxJava,开发者可以实现事件的异步处理和链式操作。对于已经具备RxJava基础的开发者来说,本文将详细介绍如何利用RxJava实现事件总线,并提供了使用建议。 ... [详细]
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社区 版权所有