Lowest Common Ancestor of a Binary Tree

来源:互联网 发布:淘宝销售宣传标语 编辑:程序博客网 时间:2024/05/29 04:26

dfs,第一次用了临时vector存储经过的路径,最后比较两个路径得到公共祖先节点,结果超过内存限制了,也是第一次遇到超过内存限制的情况,o(╯□╰)o

这是代码

class Solution {private:vector<vector<TreeNode*> > res;public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {dfs(root, vector<TreeNode*>{},p,q);int limit = res[0].size() > res[1].size() ? res[1].size()-1 : res[0].size()-1;for (; limit >= 0; limit--){if (res[0][limit] == res[1][limit])return res[0][limit];}return NULL;}void dfs(TreeNode* root, vector<TreeNode*> tmp, TreeNode* p, TreeNode* q){if (root == NULL)return;if (root == p || root == q){tmp.push_back(root);res.push_back(tmp);tmp.pop_back();}tmp.push_back(root);dfs(root->left, tmp, p, q);dfs(root->right, tmp, p, q);}};

优化的方法是把寻找路径和寻找祖先节点这两步合到一起,当递归向下进行的时候进行目标节点的查找,当递归返回的时候进行祖先节点的查找

class Solution {public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {//发现目标节点则通过返回值标记该子树发现了某个目标结点if (root == NULL || root == p || root == q) return root;//查看左子树中是否有目标结点,没有为nullTreeNode* left = lowestCommonAncestor(root->left, p, q);//查看右子树是否有目标节点,没有为nullTreeNode* right = lowestCommonAncestor(root->right, p, q);//都不为空,说明做右子树都有目标结点,则公共祖先就是本身if (left != NULL&&right != NULL) return root;//如果发现了目标节点,则继续向上标记为该目标节点return left == NULL ? right : left;//这种边界条件的控制实在太精妙,//即包含了左右都为NULL的情况,也包含了一侧为NULL的情况}};


0 0
原创粉丝点击