首页 > 其他分享 >236. 二叉树的最近公共祖先

236. 二叉树的最近公共祖先

时间:2024-12-10 19:22:26浏览次数:3  
标签:right return 祖先 二叉树 TreeNode 236 root left

问题描述

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

分析

使用递归解决比较简单,但是不太好实现。
主要是要理解递归左子树与右子树,且如果两个目标结点在一条直线上,则直接返回第一个结点即可,不用再往下找。

class Solution {
public:
    TreeNode *p, *q;
    TreeNode *res;
    TreeNode* solve(TreeNode* root) {
        if (root == nullptr) {
            return nullptr;
        }
        if (root == p || root == q) {
            return root;
        }
        TreeNode* left = solve(root->left);
        TreeNode* right = solve(root->right);
        if (left && right) {return root;}
        // 返回左子树或者右子树中的目标结点,若无,返回空
        if (left) {
            return left;
        } else if (right) {
            return right;
        } else {
            return nullptr;
        }
    }

    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        this->p = p;
        this->q = q;
        TreeNode* res = solve(root);
        return res;
    }
};

标签:right,return,祖先,二叉树,TreeNode,236,root,left
From: https://www.cnblogs.com/saulstavo/p/18597897

相关文章

  • 105. 从前序与中序遍历序列构造二叉树
    问题描述分析逻辑上,从前序遍历中依次从前往后获取根结点,从中序里获取根结点的序号后可以获取左子树和右子树,递归构建树即可。分治/递归classSolution{public:vector<int>preorder;vector<int>inorder;unordered_map<int,int>um;//分治TreeNo......
  • LCR 048. 二叉树的序列化与反序列化(困难)(主站297)
    https://leetcode.cn/problems/h54YBf/https://leetcode-cn.com/problems/serialize-and-deserialize-binary-tree/难度:☆☆☆题目:序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另......
  • PAT 2024年春季 甲级 A-3 Degree of Skewness(二叉树的构建)
     给出后序和中序遍历序列,求出只有左子树和只有右子树的结点之差1#include<bits/stdc++.h>2usingnamespacestd;3intn;4intnl=0,nr=0;5structnode{6intdata,lchild=-1,rchild=-1;7};8vector<node>nodes(1005);9vector<int>in_o......
  • leetcode543.二叉树的直径
    给你一棵二叉树的根节点,返回该树的 直径 。二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。两节点之间路径的 长度 由它们之间边数表示。示例1:输入:root=[1,2,3,4,5]输出:3解释:3,取路径[4,2,1,3]或......
  • 114. 二叉树展开为链表
    问题描述给你二叉树的根结点root,请你将它展开为一个单链表:展开后的单链表应该同样使用TreeNode,其中right子指针指向链表中下一个结点,而左子指针始终为null。展开后的单链表应该与二叉树先序遍历顺序相同。分析注意,这里应该使用同样的TreeNode,也就是评判时,直接看原......
  • LCR 047. 二叉树剪枝(中等)(主站814)
    https://leetcode.cn/problems/pOCWxh/https://leetcode.cn/problems/binary-tree-pruning/难度:☆☆☆题目:给定一个二叉树根节点root,树的每个节点的值要么是0,要么是1。返回移除了所有不包含1的子树的原二叉树。节点node的子树为node本身,以及所有node的后......
  • 二叉树的C++实现
    文章目录一、二叉树存储的物理结构1.1二叉树基础知识1.2二叉树的存储1.2.1单个节点的存储:1.2.2二叉树的存储二、C++代码实现2.1每个二叉树节点结构体:2.2二叉树类的定义2.3方法实现一、二叉树存储的物理结构1.1二叉树基础知识(1)二叉树的定义:每个节点最多......
  • 二叉树遍历
    前序顺序为根左右递归publicstaticvoidpreLoop(TreeNoderoot){System.out.println(root.value);if(root.left!=null){preLoop(root.left);}if(root.right!=null){preLoop(root.right);}}其他使用栈,以根右左的顺......
  • 【Leetcode Top 100】94. 二叉树的中序遍历
    问题背景给定一个二叉树的根节点rootrootroot,返回它的中序遍历。数据约......
  • 199.二叉树的右视图
    /***@param{TreeNode}root*@return{number[]}*/varrightSideView=function(root){if(!root)return[];letdethMap=newMap();//Map夺储,key是当国节点的高度,value是我们当前节点的信;letqueue=[[root,0]];while(queue.length){//取出......