您的位置:首页 > 其它

算法习题39:二叉树节点距离

2013-11-01 14:56 204 查看
网易有道笔试:
(1).
求一个二叉树中任意两个节点间的最大距离,
两个节点的距离的定义是 这两个节点间边的个数,
比如某个孩子节点和父节点间的距离是1,和相邻兄弟节点间的距离是2,优化时间空间复杂度。

(2).
求一个有向连通图的割点,割点的定义是,如果除去此节点和与其相关的边,
有向图不再连通,描述算法。

----------------------------------------------------------------------------------------------------

(1)第一道题我没理解,任意两点的最大距离,这里又不是图的最长距离。。

也许是要找二叉树里距离最远的两个节点?  

还是找两个节点的距离?

我就写了个找两个节点的距离的算法

算法是:分别找到两个节点的距离,然后判断是否有重复,有则减去

这里写了一个二叉树的类,不过那个析构函数还没有实现。。

//============================================================================
// Name        : BTNodeDistance.cpp
// Author      : YLF
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <iostream>
using namespace std;

struct Node{
int value;
Node* left;
Node* right;
};

class BTree{
private:
Node* head;
public:
static const int TYPE_LMR = 1;

private:
Node* ProduceNode(int value){
Node* p = new Node();
p->value = value;
p->left = NULL;
p->right = NULL;
return p;
}

void PrintLMR(Node* p){
if(p == NULL)
return;
PrintLMR(p->left);
cout<<p->value<<" ";
PrintLMR(p->right);
}

void InsertLMR(Node* &p, int value){
if(p == NULL){
p = ProduceNode(value);
return;
}
if(value < p->value)
InsertLMR(p->left, value);
else
InsertLMR(p->right, value);
}

void GetDist(Node* p, int value, int *dist){
if(value == p->value)
return;
(*dist)++;
if(value < p->value){
GetDist(p->left, value, dist);
}else{
GetDist(p->right, value, dist);
}
}

void GetDist(Node* p, int min, int max, int *dist){
if((min<p->value && max>p->value)||(min == p->value)){
*dist = 2 * (*dist);
return;
}
(*dist)++;
if(min<p->value && max<p->value){

GetDist(p->left, min, max, dist);
}
else if(min>p->value && max>p->value)
GetDist(p->right, min, max, dist);

}
public:
BTree(){
head = NULL;
}

void Insert(int value, int type){
if(type == TYPE_LMR)
InsertLMR(head, value);
}

void Print(int type){
if(type == TYPE_LMR)
PrintLMR(head);
}

int GetDistance(int value1, int value2, int type){
int min = 0, max = 0;
int dist1=0, dist2=0, dist3=0;
value1>value2?(min=value2,max=value1):(min=value1,max=value2);
if(type == TYPE_LMR){
GetDist(head,min,&dist1);
GetDist(head,max,&dist2);
GetDist(head,min, max, &dist3);
}
return dist1+dist2-dist3;
}

int GetHeadValue(){
return head->value;
}

~BTree(){
//delete all the new node
//...
}
};

int main() {

BTree* bTree = new BTree();
int input = 0;
while(true){
cin>>input;
if(input != -1)
bTree->Insert(input,BTree::TYPE_LMR);
else
break;
}

//
bTree->Print(BTree::TYPE_LMR);

int value1 = 0, value2 = 0;
cin>>value1>>value2;
cout<<bTree->GetDistance(value1,value2,BTree::TYPE_LMR);

return 0;
}


(2)是图的问题。

这个还在研究中。。大家可以参考下别人的算法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息