当前位置: 首页 > news >正文

二叉树oj题解析

二叉树

  • 二叉树的最近公共祖先
    • 什么是最近公共祖先?
    • leetcode中求二叉树中最近公共祖先
      • 解题1.
      • 解题2.
  • 根据二叉树创建字符串

二叉树的最近公共祖先

什么是最近公共祖先?


最近的公共祖先指的是这一棵树中两个节点中深度最大的且公共的祖先节点就是最近祖先节点。
也就是说这两个节点在树中距离最近的相交
例如:8 与6中的最近公共节点为2,因为他的最大深度就是2(在同一颗子树中)。
8与4的最近公共节点为3,因为他的最大深度是3(在左右两棵子树中的情况)。

在这里插入图片描述

leetcode中求二叉树中最近公共祖先

在这里插入图片描述

解题1.

公共祖先的三种形式:
1.题中可知:如果root根节点为q或者p,root这个节点就是最近的公共祖先节点。
2.如果p和q各自在原根节点的左右两棵子树中,则原根节点就是p和q的最近公共祖先。
3.如果p和q在根节点的同一颗子树中,则p和q的相遇之后两个节点最大深度且相交平行的第一个节点,就是最近公共祖先

在这里插入图片描述

  public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if(root==null)return null;//q或者p如果在其中的根节点上直接返回if(root==p||root==q)return root;//向左开始递归每一棵左右树TreeNode leftTree = lowestCommonAncestor(root.left,p,q);TreeNode rightTree= lowestCommonAncestor(root.right,p,q);//说明两棵树都不为nullif(leftTree!=null&&rightTree!=null){return root;}else if(leftTree!=null){return leftTree;}else{return rightTree;}}
}

解题2.

前面我们也说过p和p两个节点的最大深度就是它两个的最近公共祖先,也就是相交的节点,这里的B就是它们两个的公共祖先。
那我们为什么不能将两个节点的以相同的距离开始走,最后两个节点的值相同就是最近公共祖先

在这里插入图片描述
假如两个节点到最近公共祖先的距离相同。
我们可以创建两个栈分别来存储到达p和q距离的所有节点,假设距离相同后pop出栈,如果出栈过程中两个节点的值相同就是它两个的公共祖先了。
在这里插入图片描述
这里我们如果遇到了多余的子树节点就返回false,并将其出栈,然后继续找p或者q节点找到后直接返回true。
在这里插入图片描述

    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if(root==null)return null;Stack<TreeNode> stackP=new Stack<>();Stack<TreeNode> stackQ=new Stack<>();getTNodeLocation(root,stackP,p);getTNodeLocation(root,stackQ,q);//获取两个栈点的大小int sizeP=stackP.size();int sizeQ=stackQ.size();if(sizeP>sizeQ){int size = sizeP-sizeQ;while(size!=0){stackP.pop();size--;}}else{int size = sizeQ-sizeP;while(size!=0){stackQ.pop();size--;}}//找到两者的最近公共祖先while(!stackQ.isEmpty()&&!stackP.isEmpty()){if(stackQ.peek()==stackP.peek()){return stackQ.peek();}else{stackQ.pop();stackP.pop();}}return null;}//将指定的节点放入到栈中private boolean getTNodeLocation(TreeNode root,Stack stack,TreeNode t){//如果为null,返回给上一个节点falseif(root==null)return false;stack.push(root);//走一步放入栈一个节点if(root==t)return true;//这里root如果为t直接返回boolean judg1 =  getTNodeLocation(root.left,stack,t);if(judg1==true)return true;boolean judg2 =  getTNodeLocation(root.right,stack,t);if(judg2==true)return true;stack.pop();//这里将出多余的节点出栈return false;}

根据二叉树创建字符串

在这里插入图片描述
这里的题意:对二叉树根节点进行前序的遍历,将遍历到的子树通过括号括起来,如果左子树有节点但是右子树没有节点,则将多余的右子树的括号省略,当右子树有节点但是左子树没有节点时,将左子树节点的括号添加进去。
这里的条件是:1.左子树如果为空,右子树不为空时,左右子树都有括号。
2.左子树不为空时,右子树为空,则可以忽略右树括号。

在这里插入图片描述

   public String tree2str(TreeNode root) {StringBuilder sb=new StringBuilder();tree2strChild(root,sb);return sb.toString();}public void tree2strChild(TreeNode root,StringBuilder sb){if(root==null)return;sb.append(root.val);if(root.left!=null){sb.append("(");tree2strChild(root.left,sb);sb.append(")");}else{if(root.right!=null){sb.append("()");}}if(root.right!=null){sb.append("(");tree2strChild(root.right,sb);sb.append(")");}}

我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=121ff85d13ss0


http://www.mrgr.cn/news/78103.html

相关文章:

  • Linux 编译Ubuntu24内核
  • WebRTC音视频同步原理与实现详解(上)
  • java基础知识(常用类)
  • JUnit单元测试
  • GC垃圾回收
  • GPTZero:高效识别AI生成文本,保障学术诚信与内容原创性
  • 【快捷入门笔记】mySQL基本操作大全-运算符和句子
  • 系统设计时应时刻考虑设计模式基础原则
  • 架构-微服务-环境搭建
  • uniapp+vue2重新进入小程序就清除缓存,设备需要重新扫码
  • 从Full-Text Search全文检索到RAG检索增强
  • jquery-picture-cut 任意文件上传(CVE-2018-9208)
  • python oa服务器巡检报告脚本的重构和修改(适应数盾OTP)有空再去改
  • C++ static关键字
  • 利用processR软件包实现简单的中介效应模型
  • 【分治】--- 快速选择算法
  • 解决数据传送问题:内网http传输
  • 多模态大型语言模型(MLLM)综述
  • 【R安装】R语言的详细安装及环境配置(2024年11月)
  • Wordcloud也能生成一个,带html的词云图文件吗??
  • Flink中普通API的使用
  • 一篇文章了解Linux
  • 临床检验项目指标学习笔记
  • 【JUC-Interrupt】中断相关概念
  • 低代码开发平台搭建思考与实战
  • 嵌入式入门Day17