树中的两个结点之间的距离
2016-04-08 22:07
288 查看
/*
1) node1是node2的祖先节点或孩子节点,
可以理解为两个节点在一条线上。 例如:Dist(2,4), Dist(6,1)
2) node1 和 node2 没有直接或间接的父子关系。
例如,Dist(4,3), 他们需要一个共同的祖先节点1 连接起来
Dist(n1, n2) = Dist(root, n1) + Dist(root, n2) - 2*Dist(root, lca)
*/
#include<iostream>
using namespace std;
struct Node{
int data;
Node *lchild;
Node *rchild;
};
int max(int a,int b)
{
return a>b?a:b;
}
Node *getPublicParetnNode(Node *root,int n1,int n2)
{
if(root==NULL) return NULL;
if(root->data==n1||root->data==n2)
return root;
Node *lNode=getPublicParetnNode(root->lchild,n1,n2);
Node *rNode=getPublicParetnNode(root->rchild,n1,n2);
if(!lNode&&!rNode) return NULL;
else if(lNode&&rNode) return root;
else return lNode==NULL?rNode:lNode;
}
int getDistanceToRoot(Node *root,int n)
{
if(root==NULL)return -1;
if(root->data==n) return 0;
int level=getDistanceToRoot(root->lchild,n);
if(level==-1)//表示左子树上没有。
level=getDistanceToRoot(root->rchild,n);
if(level!=-1)
return level+1;
return -1;
}
void buildTree(Node *&root)
{
int num;
scanf("%d",&num);
if(num==0)
{
root=NULL;
return;
}
root=new Node;
root->data=num;
buildTree(root->lchild);
buildTree(root->rchild);
}
int getTwoNodeDis(Node *root,int n1,int n2)
{
int d1=getDistanceToRoot(root,n1);
int d2=getDistanceToRoot(root,n2);
Node *node=getPublicParetnNode(root,n1,n2);
int d3=getDistanceToRoot(root,node);
return d1+d2-2*d3;
}
1) node1是node2的祖先节点或孩子节点,
可以理解为两个节点在一条线上。 例如:Dist(2,4), Dist(6,1)
2) node1 和 node2 没有直接或间接的父子关系。
例如,Dist(4,3), 他们需要一个共同的祖先节点1 连接起来
Dist(n1, n2) = Dist(root, n1) + Dist(root, n2) - 2*Dist(root, lca)
*/
#include<iostream>
using namespace std;
struct Node{
int data;
Node *lchild;
Node *rchild;
};
int max(int a,int b)
{
return a>b?a:b;
}
Node *getPublicParetnNode(Node *root,int n1,int n2)
{
if(root==NULL) return NULL;
if(root->data==n1||root->data==n2)
return root;
Node *lNode=getPublicParetnNode(root->lchild,n1,n2);
Node *rNode=getPublicParetnNode(root->rchild,n1,n2);
if(!lNode&&!rNode) return NULL;
else if(lNode&&rNode) return root;
else return lNode==NULL?rNode:lNode;
}
int getDistanceToRoot(Node *root,int n)
{
if(root==NULL)return -1;
if(root->data==n) return 0;
int level=getDistanceToRoot(root->lchild,n);
if(level==-1)//表示左子树上没有。
level=getDistanceToRoot(root->rchild,n);
if(level!=-1)
return level+1;
return -1;
}
void buildTree(Node *&root)
{
int num;
scanf("%d",&num);
if(num==0)
{
root=NULL;
return;
}
root=new Node;
root->data=num;
buildTree(root->lchild);
buildTree(root->rchild);
}
int getTwoNodeDis(Node *root,int n1,int n2)
{
int d1=getDistanceToRoot(root,n1);
int d2=getDistanceToRoot(root,n2);
Node *node=getPublicParetnNode(root,n1,n2);
int d3=getDistanceToRoot(root,node);
return d1+d2-2*d3;
}
相关文章推荐
- javascript打算看的书
- 双重循环排序与冒泡排序算法
- java的异常处理
- 【剑指offer】斐波那契数列
- 虚拟现实技术走进课堂—全国首堂沉浸式教学系统公开课开启VR教育新纪元
- 操作型模式之Template Method(模板方法)模式
- 腾讯云CentOS安装Nginx
- java常用类
- JAVA线程池源码探究与简单小例子
- 1017
- 前端的架构
- Oracle数据库--实用操作(1)
- 起名真麻烦
- codeforces 593E
- 查看mysql语句运行时间
- 做汉堡
- 学习记录--javascript多态
- hdu5294(最大流+最短路)Tricks Device
- 2017京东实习生笔试题(二)
- KNN算法