剑指 Offer 68 - I. 二叉搜索树的最近公共祖先
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]
示例 1:
2
8
6。
一开始的想法是用双端队列,遍历两次,第一次记录p的祖先节点,第二次记录q的祖先节点,之后进行比对
class Solution { public: TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { deque<TreeNode*> sp; deque<TreeNode*> sq; Pan(root, p, sp); Pan(root, q, sq); TreeNode *ans = NULL; while (sp.front() == sq.front()) { ans = sp.front(); sp.pop_front(); sq.pop_front(); } return ans; } void Pan(TreeNode* root, TreeNode* p, deque<TreeNode*> &sp) { if (root == NULL) return; if (!sp.empty()&&sp.back()==p) { return; } else { sp.emplace_back(root); Pan(root->left, p, sp); Pan(root->right, p, sp); } if (sp.back() != p) { sp.pop_back(); } } };
后面看了解法是。发现自己忽略了这是个搜索树
class Solution { public: TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { TreeNode* ancestor = root; while (true) { if (p->val < ancestor->val && q->val < ancestor->val) { ancestor = ancestor->left; } else if (p->val > ancestor->val && q->val > ancestor->val) { ancestor = ancestor->right; } else { break; } } return ancestor; } };
分类:
剑指offer
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理