Lowest Common Ancestor of a Binary Tree

来源:互联网 发布:js 字符串转数字 编辑:程序博客网 时间:2024/05/16 17:40
在一个二叉树中指定两个节点,并在这两个节点中寻找他们的最小父节点!!!

struct TreeNode {int val;TreeNode *left;TreeNode *right;TreeNode(int x) : val(x), left(NULL), right(NULL) {}};struct TreeSeal{TreeSeal *left;TreeSeal *right;TreeSeal* parent;TreeNode* value;TreeSeal():left(NULL),right(NULL),parent(0){}};class Solution {private:TreeSeal* Sroot;public://现在进行TreeNode的封装,我们可以认为使用的是适配器模式void InitTreePar(TreeNode* trNode,TreeSeal* sealNode){if(trNode==NULL){return ;}sealNode->value=trNode;if(trNode->left){//记录下左子树,并记录左子树的父节点sealNode->left=new TreeSeal();sealNode->left->value=trNode->left;sealNode->left->parent=sealNode;InitTreePar(trNode->left,sealNode->left);}if(trNode->right){sealNode->right=new TreeSeal();sealNode->right->value=trNode->left;sealNode->right->parent=sealNode;InitTreePar(trNode->right,sealNode->right);}}//根据给定参数p找到在TreeSeal中的相应位置,主要是TreeSeal中记录了父节点的位置//使用递归方式进行查找,可以认为是先序遍历方式void findIt(TreeNode*& p,TreeSeal*& out,TreeSeal* Sp=NULL){if(Sp==NULL){return ;}if(Sp->value->val==p->val){out=Sp;return;}findIt(p,out,Sp->left);findIt(p,out,Sp->right);}//主要是获得两个节点的共同父节点的最小值TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {     Sroot=new TreeSeal();//由Sroot作为根节点,进行TreeNode的封装InitTreePar(root,Sroot);TreeSeal*Sp=NULL;//找到节点p,在已经封装到的TreeSeal节点序列中找到对应位置findIt(p,Sp,Sroot);TreeSeal*Sq=NULL;//找到节点q,在已经封装到的TreeSeal节点序列中找到对应位置findIt(q,Sq,Sroot);TreeSeal* cur;TreeNode* result;if(Sq!=NULL&&Sp!=NULL){//如果都找到了,那么我们需要注意的是,就是这两者有木有血缘关系,TreeSeal* i=Sq;for(;i!=NULL;i=i->parent){if(Sp->value->val==i->value->val){//开始查找从i之后的所有节点的最小值result=i->value;TreeSeal* j=i;for(;j!=NULL;j=j->parent){if(result->val<j->value->val){result=j->value;}}return result;}}//翻转查找i=Sp;for(;i!=NULL;i=i->parent){if(Sq->value->val==i->value->val){//开始查找从i之后的所有节点的最小值result=i->value;TreeSeal* j=i;for(;j!=NULL;j=j->parent){if(result->val<j->value->val){result=j->value;}}return result;}}//不具有血缘关系.则对两个父节点序列挨个比对,得到最小值直接返回cur=Sq;result=cur->value;for(;cur!=NULL;cur=cur->parent){if((cur->value->val)<(result->val)){result=cur->value;}}cur=Sp;for(;cur!=NULL;cur=cur->parent){if(cur->value->val<result->val){result=cur->value;}}return result;}else if(Sq==NULL&&Sp==NULL){//直接返回空return NULL;}else{//如果有一个不为空,则直接遍历不为空的那个cur=((Sq==NULL)?Sp:Sq);result=cur->value;for(;cur!=NULL;cur=cur->parent){if(cur->value->val<result->val){result=cur->value;}}return result;}}};

0 0
原创粉丝点击