leetcode刷题14
时间:2019-08-22
本文章向大家介绍leetcode刷题14,主要包括leetcode刷题14使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
今天刷的题是LeetCode236题,是给定一个二叉树,以及二叉树中的两个节点,然后找出两个节点的最近公共祖先
上一道题我自己的解法在这道题依旧适用,即找出两节点到根节点的路径,然后遍历。
我自己的解法,当时为了找到这条路径费了很多劲儿。这道题参考了哈LeetCode的官方解答思路,说可以用父指针的方式来解决。因此这里用了一个map集合
key保存的是当前节点,value保存的是父节点
首先是一个递归遍历,找出除了根节点外的所有节点的父节点
然后是查找。具体地代码如下:
import LeetcodePart6.TreeNode; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class LowestCommonAncestor_236_middle { private static Map<TreeNode,TreeNode> parent; public static TreeNode solution(TreeNode root, TreeNode p,TreeNode q){ parent=new HashMap<>(); getAncestor(root); List<TreeNode> plist=new ArrayList<>(); List<TreeNode> qlist=new ArrayList<>(); plist.add(p); qlist.add(q); while (parent.get(p)!=null){ TreeNode node=parent.get(p); plist.add(node); p=node; } while (parent.get(q)!=null){ TreeNode node=parent.get(q); qlist.add(node); q=node; } for (int i = 0; i <plist.size() ; i++) { for (int j = 0; j <qlist.size() ; j++) { if (plist.get(i)==qlist.get(j)){ return plist.get(i); } } } return root; } public static void getAncestor(TreeNode root){ if (root==null) return; if (root.left!=null){ parent.put(root.left,root); getAncestor(root.left); } if (root.right!=null){ parent.put(root.right,root); getAncestor(root.right); } return; } }
原文地址:https://www.cnblogs.com/cquer-xjtuer-lys/p/11393430.html
- JS魔法堂:再识ASCII实体、符号实体和字符实体
- MyBatis之传入参数——parameterType
- 被解放的姜戈07 马不停蹄
- 机器学习笔记(6):多类逻辑回归-使用gluon
- JS魔法堂:被玩坏的innerHTML、innerText、textContent和value属性
- JavaWeb(四)EL表达式
- eclipse SWT Designer 插件
- 身份证号码验证算法
- JS读书心得:《JavaScript框架设计》——第12章 异步处理
- 被解放的姜戈04 各取所需
- PLT:说说Evaluation strategy
- 被解放的姜戈06 假作真时
- idea 创建的maven+spring+mybatis项目整合 报错无法创建bean
- 代数几何:点,线,抛物线,圆,球,弧度和角度
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- (译)SDL编程入门(3)事件驱动编程
- 一个简单的Angular search UI实现
- (译)SDL编程入门(2)在屏幕上显示图像
- 【Vue进阶】手把手教你在 Vue 中使用 JSX
- (译)SDL编程入门(1)Hello SDL
- Django使用Channels实现websocket
- (译)SDL编程入门(6)扩展库SDL_image
- 牛客网剑指offer-2
- 牛客网剑指offer-1
- (译)SDL编程入门(5)Surface 优化和软拉伸
- (译)SDL编程入门(4)按键操作
- webpack实战——生产环境配置【中】
- MongoDB权威指南学习笔记(1)--基础知识与对文档的增删改查
- 利用 Shell 脚本实现邮件监控 Linux 系统的内存
- MongoDB权威指南学习笔记(4)--应用管理和服务器管理