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

网易有道笔试:
(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)是图的问题。

这个还在研究中。。大家可以参考下别人的算法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值