算法通关村第八关黄金挑战——二叉树的最近公共祖先问题解析

大家好,我是怒码少年小码。

今天依旧是一期递归二叉树的题目讲解,说实话,我要吐了!!!!

最近真的是做也做不对,看也看不懂,太难了~

二叉树的最近公共祖先

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; //左右都为空;
}

让我们逐行解释这段代码的含义:

  1. TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q):该函数的返回类型是 TreeNode*,表示返回一个指向树节点的指针。函数参数为 rootpq,分别表示二叉树的根节点以及要寻找最近公共祖先的两个节点。

  2. if (root == nullptr || p == nullptr || q == nullptr) { return root; }:这行代码是检查输入参数,确保二叉树的根节点和要查找的节点 pq 都不为空。如果有任何一个为空,说明无法找到最近公共祖先,直接返回树的根节点。

  3. TreeNode* left = lowestCommonAncestor(root->left, p, q);:递归调用 lowestCommonAncestor 函数来寻找左子树中节点 pq 的最近公共祖先,将结果保存在变量 left 中。

  4. TreeNode* right = lowestCommonAncestor(root->right, p, q);:递归调用 lowestCommonAncestor 函数来寻找右子树中节点 pq 的最近公共祖先,将结果保存在变量 right 中。

  5. if (left == nullptr && right == nullptr) { return nullptr; }:如果 leftright 都为空,说明左右子树中都没有找到 pq 的最近公共祖先。在这种情况下,返回空指针。

  6. if (left == nullptr) { return right; }:如果 left 为空,说明左子树中没有找到 pq 的最近公共祖先,那么返回右子树中找到的最近公共祖先 right

  7. if (right == nullptr) { return left; }:如果 right 为空,说明右子树中没有找到 pq 的最近公共祖先,那么返回左子树中找到的最近公共祖先 left

  8. return root;:如果 leftright 都不为空,说明节点 pq 分别在左右子树中,因此当前的根节点 root 就是最近公共祖先。

在这段代码中,递归函数的核心思想是通过遍历二叉树,不断向下搜索节点 pq 的最近公共祖先。通过递归调用函数来查找左子树和右子树中的最近公共祖先,并根据不同情况返回合适的结果。最终,返回的结果就是节点 pq 的最近公共祖先。

你可能感兴趣的:(算法,数据结构,c++)