/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: void serch_patch(TreeNode* root, TreeNode* node,vector<TreeNode*> &path,bool &is_search) { path.push_back(root); if(root->val==node->val)//要是找到路径了 { is_search=true;//标志修改,然后返回 return; } if(root->left!=NULL) serch_patch(root->left,node,path,is_search); if(is_search)//在左边找到了,就不用在右面找了 return; if(root->right!=NULL) serch_patch(root->right,node,path,is_search); if(is_search)//在右面找到了,就不用删除根节点了 return; path.pop_back(); } TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { bool is_flag=false; vector<TreeNode*> path_p; serch_patch(root,p,path_p,is_flag);//寻找root到p的路径 is_flag=false; vector<TreeNode*> path_q; serch_patch(root,q,path_q,is_flag);//寻找root到q的路径 int len=min(path_p.size(),path_q.size()); TreeNode* res=root; for(int i=0;i<len;i++)//比较当前路径,若在最小长度下找到一致的就记住,即便一致都相等,也可以用最后一个 { if(path_p[i]==path_q[i]) res=path_p[i]; } return res;//找不到就返回root,无所谓的 } };
分析:
一不是二叉搜索树,二没有父节点信息,只想到用路径去判断了。