Problem: 236. 二叉树的最近公共祖先
[TOC]
思路
我们需要得到祖先节点,也就是说先遍历子节点再遍历父节点,后序遍历可以做到这一点,对于从子节点判断父节点的题目都可以用后序遍历。
返回条件,找到了p q
或为nullptr,返回该节点,在处理中间节点时,我们收集左右节点的结果,如果都不为空则在左右子树上找到了p q
,我们可以返回该节点。
复杂度
时间复杂度:
添加时间复杂度, 示例: $O(n)$
空间复杂度:
添加空间复杂度, 示例: $O(n)$
Code
[]1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
class Solution { public: TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { if (root == nullptr || root == p || root == q) 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; } };
|