方法1:
建立指向父节点的树;
struct Node{ Node* pre; Node* left; Node* right; TreeNode* cur; Node(TreeNode* root,Node* pre_root):cur(root),pre(pre_root){} }; class Solution { public: //建立包含指向父节点的树 void DFS(TreeNode* root,Node* pre_root) { if(root==NULL) return; Node* pre_left=new Node(root->left,pre_root); Node* pre_right=new Node(root->right,pre_root); pre_root->left=pre_left; pre_root->right=pre_right; DFS(root->left,pre_left); DFS(root->right,pre_right); } //目标节点在父节点树中的位置 void DFS_Node(Node* root,Node *&root_p,TreeNode* p) { if(root==NULL||root->cur==NULL) return; if(root->cur==p) { root_p=root; return; } DFS_Node(root->left,root_p,p); DFS_Node(root->right,root_p,p); } //根据父节点树找到从根节点到目标节点的路径 stack<TreeNode*> GetRoute(Node* root) { stack<TreeNode*> vec; while(root->pre!=NULL) { vec.push(root->cur); root=root->pre; } vec.push(root->cur); return vec; } TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { if(!root) return NULL; Node* pre_root=new Node(root,NULL); DFS(root,pre_root); Node* pre_p, *pre_q; DFS_Node(pre_root, pre_p, p); DFS_Node(pre_root, pre_q, q); stack<TreeNode*> res_p,res_q; res_p=GetRoute(pre_p); res_q=GetRoute(pre_q); TreeNode* top=NULL; while(!res_p.empty()&&!res_q.empty()) { if(res_p.top()!=res_q.top()) break; top=res_p.top(); res_p.pop(); res_q.pop(); } return top; } };方法2:
分治法,查看节点是否在两颗子树中;
class Solution { public: TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { if(root==NULL) return NULL; if(root==p||root==q)return root; TreeNode* left=lowestCommonAncestor(root->left, p, q); TreeNode* right=lowestCommonAncestor(root->right, p, q); if(left&&right) return root; return left==NULL?right:left; } };方法3:
直接找到节点路径
class Solution { public: TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { if(root==NULL||q==NULL||p==NULL) return NULL; vector<TreeNode*> vp,vq,res_p,res_q; vp.push_back(root); vq.push_back(root); GetPath(root, p,vp); GetPath(root, q,vq); TreeNode* lca=NULL; for(int i=0;i<vp.size()&&i<vq.size();i++) { if(vp[i]==vq[i])lca=vp[i]; else break; } return lca; } private: bool GetPath(TreeNode* root,TreeNode* p, vector<TreeNode*>& vt) { if(root==p) { return true; } if(root->left) { vt.push_back(root->left); if(GetPath(root->left, p, vt)) return true; vt.pop_back(); } if(root->right) { vt.push_back(root->right); if(GetPath(root->right, p, vt)) return true; vt.pop_back(); } return false; } };其他:
http://arsenal591.blog.163.com/blog/static/253901269201510169448656/