大家好,我是怒码少年小码。
今天依旧是一期递归二叉树的题目讲解,说实话,我要吐了!!!!
最近真的是做也做不对,看也看不懂,太难了~
二叉树的最近公共祖先
LeetCode 236:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if (root ==nullptr || p == nullptr || q == nullptr) {
return root;
}
TreeNode* left = lowestCommonAncestor(root->left, p, q);
TreeNode* right = lowestCommonAncestor(root->right, p, q);
if (left == nullptr && right == nullptr) {
return nullptr;
}
if (left == nullptr) {
return right;
}
if (right == nullptr) {
return left;
}
return root; //左右都为空;
}
让我们逐行解释这段代码的含义:
-
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q)
:该函数的返回类型是TreeNode*
,表示返回一个指向树节点的指针。函数参数为root
,p
和q
,分别表示二叉树的根节点以及要寻找最近公共祖先的两个节点。 -
if (root == nullptr || p == nullptr || q == nullptr) { return root; }
:这行代码是检查输入参数,确保二叉树的根节点和要查找的节点p
、q
都不为空。如果有任何一个为空,说明无法找到最近公共祖先,直接返回树的根节点。 -
TreeNode* left = lowestCommonAncestor(root->left, p, q);
:递归调用lowestCommonAncestor
函数来寻找左子树中节点p
和q
的最近公共祖先,将结果保存在变量left
中。 -
TreeNode* right = lowestCommonAncestor(root->right, p, q);
:递归调用lowestCommonAncestor
函数来寻找右子树中节点p
和q
的最近公共祖先,将结果保存在变量right
中。 -
if (left == nullptr && right == nullptr) { return nullptr; }
:如果left
和right
都为空,说明左右子树中都没有找到p
和q
的最近公共祖先。在这种情况下,返回空指针。 -
if (left == nullptr) { return right; }
:如果left
为空,说明左子树中没有找到p
和q
的最近公共祖先,那么返回右子树中找到的最近公共祖先right
。 -
if (right == nullptr) { return left; }
:如果right
为空,说明右子树中没有找到p
和q
的最近公共祖先,那么返回左子树中找到的最近公共祖先left
。 -
return root;
:如果left
和right
都不为空,说明节点p
和q
分别在左右子树中,因此当前的根节点root
就是最近公共祖先。
在这段代码中,递归函数的核心思想是通过遍历二叉树,不断向下搜索节点 p
和 q
的最近公共祖先。通过递归调用函数来查找左子树和右子树中的最近公共祖先,并根据不同情况返回合适的结果。最终,返回的结果就是节点 p
和 q
的最近公共祖先。