//============================================================================ // Name : 100题之二叉树两个结点的最低共同父节点.cpp // Author : // Version : // Copyright : Your copyright notice // Description : Hello World in C++, Ansi-style //============================================================================ #include <iostream> #include<stack> using namespace std; struct TreeNode { int date; TreeNode* left; TreeNode* right; TreeNode(int date1):date(date1),left(NULL),right(NULL){} }; void print_tree( TreeNode*root) { if(root) { print_tree(root->left); cout<<root->date<<" "; print_tree(root->right); } } TreeNode* Create_tree(TreeNode**head,int date) { TreeNode*p=new TreeNode(date); TreeNode *q=*head; TreeNode *s=NULL; if(!*head) { *head=p; } else { while(q) { s=q; if(q->date>date) q=q->left; else q=q->right; } if(s->date>date) { s->left=p; } else { s->right=p; } } return p; } bool FindPath(TreeNode *root,TreeNode*p,stack<TreeNode*> &v) { if(!root) return false; if(!root->left&&!root->right) { if(p==root) { v.push(root); return true; } } if(root==p) { v.push(root); return true; } if(root->left) { if(FindPath(root->left,p,v)) { v.push(root); return true; } } if(root->right) { if(FindPath(root->right,p,v)) { v.push(root); return true; } } return false; } TreeNode* findFather(TreeNode *root,TreeNode*p,TreeNode *q) { if(!p||!q||!root) return NULL; stack< TreeNode*>v1; stack< TreeNode*>v2; bool type1=FindPath(root,p,v1); bool type2=FindPath(root,q,v2); TreeNode* temp=NULL; if(type1&&type2) { int size1=v1.size(); int size2=v2.size(); size1=size1<size2?size1:size2; for(int i=0;i<size1;i++) { if(v1.top()==v2.top()) { temp=v1.top(); cout<<temp->date<<" "; } v1.pop(); v2.pop(); } cout<<endl; } return temp; } TreeNode* findFather1(TreeNode *root,TreeNode*p,TreeNode *q) { if(!p||!q||!root) return NULL; int date1=p->date; int date2=q->date; while(root) { if(root->date<date1&&root->date<date2) { root=root->right; } else if(root->date>date1&&root->date>date2) { root=root->left; } else if(root->date==date1||root->date==date2) { return root; } else if((root->date<date1&&root->date>date2)||(root->date>date1&&root->date<date2)) { return root; } } return NULL; } int main() { TreeNode*head=NULL; Create_tree(&head,3); Create_tree(&head,5); Create_tree(&head,7); Create_tree(&head,9); TreeNode*p=Create_tree(&head,8); TreeNode*q=Create_tree(&head,23); print_tree(head); TreeNode*s=findFather(head,p,q); TreeNode*s1=findFather1(head,p,q); if(s) cout<<s->date<<endl; if(s1) cout<<s1->date<<endl; return 0; }