Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BST.
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).”
_______6______ / \ ___2__ ___8__ / \ / \ 0 _4 7 9 / \ 3 5
For example, the lowest common ancestor (LCA) of nodes 2
and 8
is 6
. Another example is LCA of nodes 2
and 4
is 2
, since a node can be a descendant of itself according to the LCA definition.
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
/**********编写下面代码的时候我还不了解二叉搜索树的特点,以下代码对于任何二叉树均适用,关于二叉搜索树的知识将转载到数据结构分类中*********/
方法一:编写函数找到两个节点的根路径,存储在两个vector里,再通过遍历vector找到相同的最后面一个元素
1 class Solution { 2 public: 3 bool TraceNode(TreeNode* root, TreeNode* p, vector<TreeNode*>& vec) { 4 if(!root) { 5 return false; 6 } 7 vec.push_back(root); 8 if(root == p) { 9 return true; 10 } 11 if(!TraceNode(root->left, p, vec)) { 12 if(root->left != NULL) { 13 vec.pop_back(); 14 } 15 if(!TraceNode(root->right, p, vec)) { 16 if(root->right != NULL) { 17 vec.pop_back(); 18 } 19 return false; 20 } else { 21 return true; 22 } 23 } else { 24 return true; 25 } 26 } 27 TreeNode* GetlowestCommonEle(vector<TreeNode*> vec1, vector<TreeNode*> vec2) { 28 for(int i = vec1.size() - 1; i >= 0; i--) { 29 for(int j = vec2.size() - 1; j >= i; j--) { 30 if(vec1[i] == vec2[j]) { 31 return vec1[i]; 32 } 33 } 34 } 35 } 36 TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { 37 TraceNode(root, p, vec1); 38 TraceNode(root, q, vec2); 39 if(vec1.size() < vec2.size()) { 40 return GetlowestCommonEle(vec1, vec2); 41 } else { 42 return GetlowestCommonEle(vec2, vec1); 43 } 44 } 45 private: 46 vector<TreeNode*> vec1; 47 vector<TreeNode*> vec2; 48 };
方法二:把二叉树以固定格式存储在vector中,每个元素的parent可以根据vector的index计算得出
目前运行时出现错误,在家里没有好的调试环境,过两天修改好再更新