题目大意:给出一个二叉树和书中任意两个节点,要求找出它们的公共节点。
算法思想:
先序遍历该二叉树,在遍历的过程中记录下找到p,q节点的路径,然后比较中这两条路径找到它们路径中最后一个公共节点。
先序遍历的算法参考:先序遍历非递归实现
代码如下:
/**
* 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:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
TreeNode* res=NULL;
if(root==NULL) return res;
vector<vector<TreeNode*> > nodes;
vector<TreeNode*> tmp;
pair< TreeNode*, TreeNode* > cur;
bool flag=false;
stack<pair<TreeNode*,TreeNode*> > S;
S.push(make_pair(root,(TreeNode*)NULL));
while(!S.empty()){
cur=S.top();
S.pop();
if(flag){
while(cur.second!=tmp.back()){
tmp.pop_back();
}
flag=false;
}
tmp.push_back(cur.first);
if(cur.first->left==NULL&&cur.first->right==NULL){
flag=true;
}
if(cur.first==p||cur.first==q){
nodes.push_back(tmp);
}
if(nodes.size()==2) break;
if(cur.first->right!=NULL){
S.push(make_pair(cur.first->right,cur.first));
}
if(cur.first->left!=NULL){
S.push(make_pair(cur.first->left,cur.first));
}
}
for(int i=0;i<nodes[0].size()&&i<nodes[1].size();++i){
if(nodes[0][i]!=nodes[1][i])
break;
res=nodes[0][i];
}
return res;
}
};