网易有道笔试:
(1).
求 一个二叉树中任意两 个节点间的最大距离,
两个节点的距离的定义是 这 两个节点间边的个数,
比如某个孩子节点和父节点间的距离是1,和相邻兄弟节点间的距离是2,优化时间空间复杂度。
(2).
求一个有向连通图的割点,割 点的定义是,如 果除去此节点和与其相关的边,
(2)是图的问题。
(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)是图的问题。
这个还在研究中。。大家可以参考下别人的算法