寻找二叉树公共祖先结点递归实现

简介: 寻找二叉树公共祖先结点递归实现寻找二叉树公共祖先结点递归实现
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
/*寻找公共祖先结点LCA算法de思想:
第零种情况:root为null时直接return
第一种情况:如果p在左子树q在右子树或反之则root为LCA
第二种情况:p和q均在左子树(LCA递归左子树)
第三种情况:p和q均在右子树(LCA递归右子树)
PS:最后return的right和left不会同时为NULL
*/
class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if(root==NULL||root==p||root==q) return root;
        TreeNode* left=lowestCommonAncestor(root->left,p,q);
        TreeNode* right=lowestCommonAncestor(root->right,p,q);
        if(left && right){
            return root; 
        }else{
            return left==NULL?right:left;
        }
    }
};

image.png

image.png

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if(root == NULL || root == p || root == q){
            return root;
        }
        //将题目简化为查找以root为根结点的二叉树上是否有p或q节点,有则返回root
        //递归左子树
        TreeNode* left = lowestCommonAncestor(root->left, p, q);
        //递归右子树
        TreeNode* right = lowestCommonAncestor(root->right, p, q);
        if(left && right){
            //左右子树上均能找到p或q,即p和q分居左右子树,直接返回root
            return root;
        }else{
            //最后的right和left不会同时为NULL
            return left == NULL? right: left;
        }
    }
};
相关文章
|
3月前
|
存储
二叉树详解(深度优先遍历、前序,中序,后序、广度优先遍历、二叉树所有节点的个数、叶节点的个数)
二叉树详解(深度优先遍历、前序,中序,后序、广度优先遍历、二叉树所有节点的个数、叶节点的个数)
|
3月前
|
存储
二叉树链式结构的实现和二叉树的遍历以及判断完全二叉树
二叉树链式结构的实现和二叉树的遍历以及判断完全二叉树
34 1
|
3月前
|
机器学习/深度学习 C++
初阶数据结构之---二叉树链式结构(二叉树的构建,二叉树的前序,中序,后序和层序遍历,计算二叉树结点个数,第k层结点个数,叶子结点个数,判断是否为完全二叉树)
初阶数据结构之---二叉树链式结构(二叉树的构建,二叉树的前序,中序,后序和层序遍历,计算二叉树结点个数,第k层结点个数,叶子结点个数,判断是否为完全二叉树)
|
3月前
|
算法
二叉树的结点个数、叶子结点个数的代码实现<分治算法>
二叉树的结点个数、叶子结点个数的代码实现<分治算法>
|
11月前
|
C++
二叉树的中后序遍历构建及求叶子
二叉树的中后序遍历构建及求叶子
118 0
剑指offer 76. 树中两个结点的最低公共祖先
剑指offer 76. 树中两个结点的最低公共祖先
57 0
|
算法 C语言
【递归调用在二叉树中的应用】前序遍历、中序遍历、后序遍历、求二叉树叶子结点及复制二叉树的C语言实现
【递归调用在二叉树中的应用】前序遍历、中序遍历、后序遍历、求二叉树叶子结点及复制二叉树的C语言实现
139 0
【递归调用在二叉树中的应用】前序遍历、中序遍历、后序遍历、求二叉树叶子结点及复制二叉树的C语言实现
二叉树的层序遍历、二叉树叶节点输出算法、求二叉树的高度、层序创建一棵二叉树
二叉树的层序遍历、二叉树叶节点输出算法、求二叉树的高度、层序创建一棵二叉树
二叉树的三种非递归遍历方式
二叉树的三种非递归遍历方式
二叉树的创建,和三种递归遍历方式
二叉树的创建,和三种递归遍历方式