leetcode 236. Lowest Common Ancestor of a Binary Tree
来源:互联网 发布:玻璃砖知乎 编辑:程序博客网 时间:2024/05/16 16:03
Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in the tree.
According to the definition of LCA on Wikipedia: “The lowest common ancestor is defined between two nodes v and w as the lowest node in T that has both v and w as descendants (where we allow a node to be a descendant of itself).”
_______3______ / \ ___5__ ___1__ / \ / \ 6 _2 0 8 / \ 7 4
For example, the lowest common ancestor (LCA) of nodes 5
and 1
is 3
. Another example is LCA of nodes 5
and 4
is 5
, since a node can be a descendant of itself according to the LCA definition.
第一种方法
struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; class Solution { void findpath(TreeNode* node, TreeNode* p,vector<TreeNode*>pathpp,vector<TreeNode*>&pathp) { if(node==p) { vector<TreeNode*>path=pathpp; path.push_back(node); pathp=path; return ; } if(node->left!=NULL) { vector<TreeNode*>path=pathpp; path.push_back(node); if(node->left==p) { path.push_back(p); pathp=path; return ; } else findpath(node->left,p,path,pathp); } if(node->right!=NULL) { vector<TreeNode*>path=pathpp; path.push_back(node); if(node->right==p) { path.push_back(p); pathp=path; return ; } else findpath(node->right,p,path,pathp); } } public: TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { vector<TreeNode*>pathp,pp,qq,pathq; findpath(root,p,pp,pathp); findpath(root,q,qq,pathq); int k=pathp.size()<pathq.size()?pathp.size():pathq.size(); int i=0; while(i<k&&pathp[i]==pathq[i]) i++; if(i==k) return pathp.size()<pathq.size()?pathp.back():pathq.back(); else return pathp[i-1]; } };Memory Limit Exceeded
构造节点TN记录每个节点的父节点,否则向上找父节点太麻烦,val其实也可以不要。
struct TN {int val;TN*parent;TN(int x) : val(x),parent(NULL) {}};class Solution {public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {vector<TreeNode*>que, qq;que.push_back(root);TN*root1 = new TN(root->val);vector<TN*>que1, qq1; que1.push_back(root1);bool pf(true), qf(true);while (!que.empty()&&(pf||qf)){vector<TreeNode*>newque;vector<TN*>newque1;for (int i = 0; (i < que.size()) && (pf || qf); i++){if (que[i] == p)pf = false;if (que[i] == q)qf = false;qq.push_back(que[i]);qq1.push_back(que1[i]);if (que[i]->left != NULL){TN*n = new TN(que[i]->left->val);n->parent = que1[i];newque.push_back(que[i]->left);newque1.push_back(n);}if (que[i]->right != NULL){TN*n = new TN(que[i]->right->val);n->parent = que1[i];newque.push_back(que[i]->right);newque1.push_back(n);}}que = newque;que1 = newque1;}int pindex = find(qq.begin(), qq.end(), p) - qq.begin();int qindex = find(qq.begin(), qq.end(), q) - qq.begin();vector<TN*>pathp, pathq;TN*nn = qq1[pindex];while (nn!= NULL){pathp.push_back(nn);nn = nn->parent;}nn = qq1[qindex];while (nn != NULL){pathq.push_back(nn);nn = nn->parent;}int k = pathp.size()<pathq.size() ? pathp.size() : pathq.size();int i = 0;while (i<k&&pathp[pathp.size() - 1 - i] == pathq[pathq.size()-1-i])i++;if (i == k){TN*tt = pathp.size() < pathq.size() ? pathp[0] : pathq[0];int reindex = find(qq1.begin(), qq1.end(), tt) - qq1.begin();return qq[reindex];}else{TN*tt = pathp[pathp.size() - i];int reindex = find(qq1.begin(), qq1.end(), tt) - qq1.begin();return qq[reindex];}}};
accepted
0 0
- [leetcode] 236.Lowest Common Ancestor of a Binary Tree
- [LeetCode]236.Lowest Common Ancestor of a Binary Tree
- [leetcode] 236.Lowest Common Ancestor of a Binary Tree
- [LeetCode]236. Lowest Common Ancestor of a Binary Tree
- 236. Lowest Common Ancestor of a Binary Tree LeetCode
- [leetcode] 236. Lowest Common Ancestor of a Binary Tree
- leetcode 236. Lowest Common Ancestor of a Binary Tree
- LeetCode-236.Lowest Common Ancestor of a Binary Tree
- LeetCode 236. Lowest Common Ancestor of a Binary Tree
- LeetCode *** 236. Lowest Common Ancestor of a Binary Tree
- leetcode.236. Lowest Common Ancestor of a Binary Tree
- LeetCode - 236. Lowest Common Ancestor of a Binary Tree
- LeetCode 236. Lowest Common Ancestor of a Binary Tree
- [LeetCode] 236. Lowest Common Ancestor of a Binary Tree
- [leetcode] 236. Lowest Common Ancestor of a Binary Tree
- Leetcode 236. Lowest Common Ancestor of a Binary Tree
- Leetcode 236. Lowest Common Ancestor of a Binary Tree
- Leetcode-236. Lowest Common Ancestor of a Binary Tree
- 1123: 【C语言训练】列出最简真分数序列*
- 深入理解java异常处理机制
- hdu 5656 CA Loves GCD(dp+gcd)(Bestcoder #78 1002)
- Markdown格式小计
- *** glibc detected ***
- leetcode 236. Lowest Common Ancestor of a Binary Tree
- Java上传文件到MongoDB GirdFS
- 解读为毛我的iPhone5老是升级不了iOS9.3新系统
- JS调用微信API实现微信支付
- 最全最强解析:支付宝钱包系统架构内部剖析(架构图)
- Dijkstra最短路径算法
- IAP15L2K61S2仿真出错的原因和解决办法
- java IO 之文件的复制
- [leetcode]36. Valid Sudoku c语言