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

简介: 二叉树编程题解析

image.png

传送门:236. 二叉树的最近公共祖先

题目给我们一棵树以及树上的两个节点。要我们求两个节点的最近公共祖先。什么叫祖先呢,只要是与这个节点的有血缘关系的父节点,包括其自身都可以称作这个节点的祖先。而要我们求节点的最近公共祖先,不由得让人想到用找两个树时的路径进行对比。若分别找到二者的路径,则这个问题便演变成了找两个链表交点的问题。

现在的主要问题就是该如何找节点的路径?不妨使用DFS算法进行实现,用栈进行存储。由于DFS会不断深入和回溯,每次走错路就将之前的路径出栈,否则便继续深入,直到找到目标节点为止。最后用两个栈进行查找第一个相同的节点便可以解决问题。

bool getpath(TreeNode* root,TreeNode* x,stack<TreeNode*>& path)
    {
        if(root == nullptr) return false;           //走到空节点即找不到返回失败
        path.push(root);                            //走到新节点就先入栈
        if(root == x) return true;                  //找到目标节点返回成功
        if(getpath(root->left,x,path))              //判断往左找是否成功
        {
            return true;
        }
        if(getpath(root->right,x,path))             //判断往右找是否成功
        {
            return true;
        }
        path.pop();                                 //出栈
        return false;                               //都没有就返回失败
    }
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        stack<TreeNode*> ppath,qpath;          //定义两个栈用于存储路径
        getpath(root,p,ppath);                 //求p的路径
        getpath(root,q,qpath);                 //求q的路径
        while(ppath.size()!= qpath.size())    
        {
            if(ppath.size()>qpath.size())      //把长的部分去掉使得两个栈一样长
            {
                ppath.pop();
            }
            else
            {
                qpath.pop();
            }
        }
        while(ppath.top()!=qpath.top())        //找第一个相同节点
        {
            ppath.pop();
            qpath.pop();
        }
        return ppath.top();
    }

image.gif

目录
相关文章
|
13天前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
27 6
|
3天前
|
存储 算法
二叉树进阶-学会层序遍历助你一次刷完leetcode10道题
文章深入探讨了二叉树的层序遍历方法,并展示了如何通过队列实现层序遍历的算法逻辑,同时指出掌握层序遍历技巧可以帮助解决LeetCode上的多道相关题目。
二叉树进阶-学会层序遍历助你一次刷完leetcode10道题
|
3天前
|
算法 Java
LeetCode第94题二叉树的中序遍历
文章介绍了LeetCode第94题"二叉树的中序遍历"的解法,使用递归实现了中序遍历的过程,遵循了"左根右"的遍历顺序,并提供了清晰的Java代码实现。
LeetCode第94题二叉树的中序遍历
|
13天前
|
索引 Python
【Leetcode刷题Python】从列表list中创建一颗二叉树
本文介绍了如何使用Python递归函数从列表中创建二叉树,其中每个节点的左右子节点索引分别是当前节点索引的2倍加1和2倍加2。
15 7
|
13天前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - II. 从上到下打印二叉树 II
本文提供了一种Python实现方法,用于层次遍历二叉树并按层打印结果,每层节点按从左到右的顺序排列,每层打印到一行。
24 3
|
13天前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - I. 从上到下打印二叉树
本文介绍了使用Python实现从上到下打印二叉树的解决方案,采用层次遍历的方法,利用队列进行节点的访问。
20 2
|
14天前
|
Python
【Leetcode刷题Python】257. 二叉树的所有路径
LeetCode第257题"二叉树的所有路径"的Python语言解决方案,通过深度优先搜索算法来找到并返回所有从根节点到叶子节点的路径。
13 2
|
14天前
|
Python
【Leetcode刷题Python】111. 二叉树的最小深度
LeetCode第111题"二叉树的最小深度"的Python语言解决方案,通过递归计算从根节点到最近叶子节点的最短路径上的节点数量。
9 2
|
11天前
|
存储 算法 Java
LeetCode经典算法题:二叉树遍历(递归遍历+迭代遍历+层序遍历)以及线索二叉树java详解
LeetCode经典算法题:二叉树遍历(递归遍历+迭代遍历+层序遍历)以及线索二叉树java详解
29 0
|
11天前
|
算法 Java
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
22 0