//二叉树任意两节点最近公共父节点
#include <bits/stdc++.h>
using namespace std;
struct Node
{
int val;
bool visit;
struct Node*left;
struct Node*right;
Node(int i):val(i),visit(false),left(NULL),right(NULL) {}
};
bool findPath(struct Node*root,struct Node*p,vector<Node*>&v)
{
v.push_back(root);
if(root==p)
{
return true;
}
bool flag=false;
if(root->left)
{
flag=findPath(root->left,p,v);
}
if(flag==false&&root->right)
{
flag=findPath(root->right,p,v);
}
if(flag==false)
v.pop_back();
return flag;
}
int main()
{
struct Node*a=new Node(1);
struct Node*b=new Node(2);
struct Node*c=new Node(3);
struct Node*d=new Node(4);
struct Node*e=new Node(5);
a->left=b;
a->right=c;
b->left=d;
b->right=e;
vector<Node*>v1,v2;
findPath(a,d,v1);
findPath(a,e,v2);
for(int i=0; i<v1.size(); i++)
cout<<v1[i]->val<<" ";
cout<<endl;
for(int i=0; i<v2.size(); i++)
cout<<v2[i]->val<<" ";
int i=0;
while(i<v1.size()&&i<v2.size())
{
if(v1[i]!=v2[i])break;
i++;
}
cout<<endl;
cout<<v1[i--]->val<<endl;
return 0;
}
//满二叉排序树任意两节点最近公共父节点
#include <bits/stdc++.h>
using namespace std;
struct Node
{
int val;
bool visit;
struct Node*left;
struct Node*right;
Node(int i):val(i),visit(false),left(NULL),right(NULL) {}
};
bool findPath(struct Node*root,int p,vector<Node*>&v)
{
v.push_back(root);
if(root->val==p)
{
return true;
}
bool flag=false;
if(root->left)
{
flag=findPath(root->left,p,v);
}
if(flag==false&&root->right)
{
flag=findPath(root->right,p,v);
}
if(flag==false)
v.pop_back();
return flag;
}
void create(struct Node*root,int k)
{
if(k==0)return ;
struct Node*pLeft=new Node(root->val-pow(2,k-1));
struct Node*pRight=new Node(root->val+pow(2,k-1));
root->left=pLeft;
root->right=pRight;
create(root->left,k-1);
create(root->right,k-1);
}
int main()
{
int n;
int a,b;
while(cin>>n>>a>>b)
{
struct Node*root=new Node(pow(2,n-1));
create(root,n-1);
vector<Node*>v1,v2;
findPath(root,a,v1);
findPath(root,b,v2);
for(int i=0; i<v1.size(); i++)
cout<<v1[i]->val<<" ";
cout<<endl;
for(int i=0; i<v2.size(); i++)
cout<<v2[i]->val<<" ";
int i=0;
while(i<v1.size()&&i<v2.size())
{
if(v1[i]!=v2[i])break;
i++;
}
cout<<endl;
cout<<v1[i--]->val<<endl;
}
return 0;
}
二叉树中两节点最近公共父节点
最新推荐文章于 2021-05-23 12:59:34 发布