您的位置:首页 > 其它

二叉树俩个子节点的公共父节点

2015-08-15 19:13 344 查看
二叉树俩个子节点的公共父节点

(1)节点只有left right  无 father  有root

1   找各自路径  vector
2   找到之后   计算稍长的那个路径 长多少   下标访问 查找 
3   找到  返回 path[i]

(2)节点有父节点  root 未知

        1   计算各自路径长度    
2   路经长的 向上走  走到 俩者路径相同处    
3    节点形同即为值

(3)二叉排序树  

1   从跟开始while遍历 temp=root   
2   俩节点都比  temp 大    temp=temp->Right
                           都            小     temp=temp->pLeft;
                          否则  返回temp

----------------树的俩节点的最低公共祖先-------------------

(1)   不知父亲  不是二叉排序树  只知道节点值

BianryTreeNode* Find(int node1,int node2,BianryTreeNode* pRoot)
{
std::vector path1;
std::vector path2;

bool find=false;

//先找到各自路径
find|=getpath(pRoot,node1,path1);
find&=getpath(pRoot,node2,path2);
BianryTreeNode* preturn =NULL;
if(find)
{

//长的先走几步,和短的相同起点
int min=path1>path2?path2:path1;
int it1=path1.size()-min;
int it2=path2.size()-min;
for(;it1 &path)
{
if(pRoot==NULL)
return ;
if(pRoot->n!=n)
{
if(find(pRoot->pLeft,n,path))
{
path.push_back(pRoot->n);
return true;
}
else if(find(pRoot->pRight,n,path))
{
path.push_back(pRoot->n);
return true;
}
else
{
return false;
}
}
else
{
path.push_back(pRoot->n);
return true;
}
}

(2)有父节点
BianryTreeNode* find(BianryTreeNode* node1,BianryTreeNode* node2)
{
if(node1==NULL||node2==NULL)
{
return NULL;
}
int len1=getlen(node1);
int len2=getlen(node2);

int n=0;
BianryTreeNode* A=NULL,*B=NULL;
if(len1>=len2)
{
BianryTreeNode* temp=node1;
while(n++pfather;
}
A=temp;
B=node2;
}
else
{
BianryTreeNode* temp=node2;
while(h++pfather;
}
A=node1;
B=temp;
}

while(A!=B)
{
A=A->pfather;
B=B->pfather;
}
return A;
}

int getlen(BianryTreeNode* node1)
{
int n=0;
BianryTreeNode* temp=node1;
if(temp->pfather)
{
temp=temp->father;
n++;
}
return n;
}

(3)二叉排序树 有root

void find(BianryTreeNode* node1,BianryTreeNode* node2)
{

if(node1==NULL||node2==NULL)
{
return NULL;
}
BianryTreeNode* temp=root;

while(temp)
{
if(node1->n>temp->n&&node2->n>temp->n)
{
temp=temp->pRight;
}
else if(node1->nn&&node2->nn)
{
temp=temp->pLeft;
}
else return temp;
}
return NULL;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: