首页 > 其他分享 >JZ86 在二叉树中找到两个节点的最近公共祖先

JZ86 在二叉树中找到两个节点的最近公共祖先

时间:2024-04-20 21:45:27浏览次数:28  
标签:遍历 int dfs JZ86 path1 二叉树 root 节点

image
image
image


class Solution {
public:

    //用来判断是否找到节点
    bool flag = false;
    //dfs遍历得到路径,递归遍历,也就是先序遍历根左右
    //传入参数:节点,容器,要找的值
    void dfs(TreeNode* root, vector<int> & path, int o)
    {
        //判断根节点的值是否是要找的那个,或者是叶子节点
        if(flag || root == NULL)
            return ;

        //将根节点加入容器,判断根节点是否是要找的那个节点,然后遍历左右子树
        path.push_back(root->val);

        if(root->val == o)
        {
            flag = true;
            return ;
        }
           
        dfs(root->left, path, o);
        dfs(root->right, path, o);

        //如果找到那个节点,就返回,如果没有找到就回溯,将最后加入的那个节点从容其中删除
        if(flag)
            return ;

        path.pop_back();
    }

    int lowestCommonAncestor(TreeNode* root, int o1, int o2) {
        // write code here
        //思路:利用dfs遍历找到两个节点的路径,然后比较路径
        //找到最后一个相同的节点值即是最近的公共祖先

        //用vector容器来存储路径
        vector<int> path1, path2;

        //dfs遍历得到路径
        dfs(root,path1,o1);

        flag = false;
        dfs(root,path2,o2);

        int res; //res用来接收最近公共祖先

        //遍历两个路径,找到最后一个相同的节点值
        for(int i = 0; i < path1.size() && i < path2.size(); i++)
        {
            if(path1[i] == path2[i])
                res = path1[i];
            else
                break;
        }
        return res;
    }
};

标签:遍历,int,dfs,JZ86,path1,二叉树,root,节点
From: https://www.cnblogs.com/H43724334/p/18148221

相关文章

  • 【根据前序和中序遍历构造二叉树】栈+迭代 || 递归
    105.从前序与中序遍历序列构造二叉树栈+迭代规律前序遍历中相邻节点u和v,v节点一定是u节点的左节点或者是其自身某个祖先的右节点一个没有右节点的链,中序遍历是从叶子到根,前序遍历是从根到叶子解题思路用一个栈维护前序遍历的节点用一个指针p指向中序遍历的第一个叶子节......
  • 给出二叉树的前序遍历和中序遍历--还原二叉树
    voidf(intidxroot){ //根据前序遍历和中序遍历还原二叉树if(idxroot==n+1)return;introot=pre[idxroot];boolcheck=true;map<int,int>lcmp,rcmp;//当前节点的左孩子集合和右孩子集合for(inti=1;i<=n;i++){if(vis[mid[i]]&&mid[i]!......
  • JZ32 从上往下打印二叉树
    /*structTreeNode{intval;structTreeNode*left;structTreeNode*right;TreeNode(intx):val(x),left(NULL),right(NULL){}};*/classSolution{public:vector<int>PrintFromTopToBottom(TreeNode*root){......
  • 递归获取某个节点的儿子节点
    java代码:publicList<Department>getAllChildrenDepartmentsFlat(LongparentId){List<Department>allDepartments=departmentRepository.findAll();//假设使用JPA的Repository来进行数据库操作List<Department>allChildren=newArrayLi......
  • 树3-二叉树非递归遍历(栈)
    树3-二叉树非递归遍历(栈)拷贝根结点,初始值FALSE,入栈弹出,如果是FALSE,将根节点将更新为TRUE,其子结点(初始值FALSE)一并入栈[A,B,C](前序遍历,入栈顺序:C,B,A输出顺序:A,B,C)再弹出,如果是TRUE则输出引入链式栈头文件#include"linkedStack.h"链式栈头文......
  • 两种解法搞定链表相邻节点交换
    最近还是很喜欢用golang来刷算法题,更接近通用算法,也没有像动态脚本语言那些语法糖,真正靠实力去解决问题。下面这道题很有趣,也是一道链表题目,具体如下:24.SwapNodesinPairsSolvedMediumTopicsCompaniesGivenalinkedlist,swapeverytwoadjacentnodesandreturni......
  • JZ36二叉树排序树与双向链表
    /*structTreeNode{ intval; structTreeNode*left; structTreeNode*right; TreeNode(intx): val(x),left(NULL),right(NULL){ }};*/#include<cstddef>classSolution{public: TreeNode*ans=nullptr; //最终的链表 TreeNode*pre=nullptr; ......
  • 树1-二叉树概念与遍历方法
    树1:二叉树概念与遍历方法二叉树二叉树的遍历二叉树遍历分为前序,中序,后序.序是指遍历根结点的顺序D-data,根L左R右,先序遍历ABCDE-FGH中序遍历BDCE-A-FHG后序遍历DECB-HGF-A先序遍历ABDH-I-EJCFG中序遍历HDI-B-JEAFCG后序遍历HID-J......
  • 树2-二叉树拷贝, 遍历, 计算叶子结点和高度
    树2-二叉树拷贝,遍历,计算叶子结点和高度二叉树结点typedefstructBinaryNode{charch;structBinaryNode*lChild;structBinaryNode*rChild;}BinaryNode;//叶子结点的数量intsum;二叉树遍历前序//递归遍历(前序)voidRecursion(BinaryNode*roo......
  • ROS2笔记2--工作空间、功能包、节点
    一、工作空间(Workspace)ROS工作空间是用于存放ros功能包的一个文件夹,通常以ws结尾。用于存放工程开发相关的所有文件,包括源代码、编译生成的文件以及配置我呢见等。在ROS中工作空间是使用Catkin编译系统来组织和管理代码的基础单元。每个工作空间通常包含一个或多个功能包,这些功能......