算法习题39:二叉树节点距离
2013-11-01 14:56
204 查看
网易有道笔试:
(1).
求一个二叉树中任意两个节点间的最大距离,
两个节点的距离的定义是 这两个节点间边的个数,
比如某个孩子节点和父节点间的距离是1,和相邻兄弟节点间的距离是2,优化时间空间复杂度。
(2).
求一个有向连通图的割点,割点的定义是,如果除去此节点和与其相关的边,
有向图不再连通,描述算法。
----------------------------------------------------------------------------------------------------
(1)第一道题我没理解,任意两点的最大距离,这里又不是图的最长距离。。
也许是要找二叉树里距离最远的两个节点?
还是找两个节点的距离?
我就写了个找两个节点的距离的算法
算法是:分别找到两个节点的距离,然后判断是否有重复,有则减去
这里写了一个二叉树的类,不过那个析构函数还没有实现。。
(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)是图的问题。
这个还在研究中。。大家可以参考下别人的算法
相关文章推荐
- 微软算法100道题-----求二叉树中节点的最大距离
- 微软等数据结构+算法面试100题(38)-- 二叉树中任意两个节点间的最大距离
- 求二叉树中节点的最大距离算法(C)
- 每天学习一算法系列(11) (求二叉树中节点的最大距离)
- 【数据结构与算法】二叉树给定两个节点的最短距离(C++实现)
- 笔试算法题(36):寻找一棵二叉树中最远节点的距离 & 根据二叉树的前序和后序遍历重建二叉树
- 算法:求二叉树中两个节点的最大距离
- 微软算法100题11 求二叉树中两节点之间的最大距离
- 每天学习一算法系列(34)(求一个二叉树中任意两个节点间的最大距离,两个节点的距离的定义是这两个节点间边的个数)
- 任意一棵二叉树中最大距离的两个节点【算法】
- 算法与数据结构面试题(11)-求二叉树中节点的最大距离
- 【算法题目】求二叉树中节点的最大距离
- 39 二叉树中两个节点最大距离
- 求一个二叉树中距离最远的两个节点
- 11.求二叉树中节点的最大距离
- 算法题——二叉树中结点的最远距离
- 编程之美--求二叉树中节点的最大距离
- 一颗普通的二叉树,如何寻找两个节点的最低公共祖先(发现的一个与算法无关的引用问题)
- 求二叉树中节点的最大距离
- 搜狐研究院 求二叉树最大叶子节点到最小叶子节点的距离