二叉树中相距最远的两个节点之间的距离
2015-10-31 20:07
363 查看
题目:在一棵二叉树中,找出相距最远的两个节点之间的距离,函数返回距离值(提示:递归)
解答:这是2015年微软校招面试中的一道题目,如果能想到这两个节点必定在某个节点的左右子树中,那么只要找到该节点左子树中最深的节点以及右子树中最深的节点,二者之和即为左右最深节点的距离,如果对每个节点做同样的运算,取最大值,那么可以得到最远距离。重复地计算每一个节点必然提高时间复杂度,所以递归是一个不错的方式。
struct TreeNode{
int m_data;
TreeNode* m_pLeft;
TreeNode* m_pRight;
TreeNode(const int data = 0,TreeNode* left=NULL,TreeNode* right=NULL):
m_data(data),m_pLeft(left),m_pRight(right){}
};
int LongestPathRecursive(TreeNode* pNode,int& left_len,int& right_len,int& max_len)
{
if(NULL == pNode)
{
left_len = 0;
right_len = 0;
max_len = 0;
return max_len;
}
int left_left_len = 0;
int left_right_len = 0;
int left_max_len = 0;
int right_left_len = 0;
int right_right_len = 0;
int right_max_len = 0;
LongestPathRecursive(pNode->m_pLeft,left_left_len,left_right_len,left_max_len);
LongestPathRecursive(pNode->m_pRight,right_left_len,right_right_len,right_max_len);
left_len = max(left_left_len,left_right_len) + 1;
right_len = max(right_left_len,right_right_len) + 1;
max_len = max(left_left_len+right_left_len,max(left_max_len,right_max_len));
return max_len;
}
int LongestPath(TreeNode* pRoot)
{
if(!pRoot)
return -1;
int left_len = 0;
int right_len = 0;
int max_len = 0;
return LongestPathRecursive(pRoot,left_len,right_len,max_len);
}
解答:这是2015年微软校招面试中的一道题目,如果能想到这两个节点必定在某个节点的左右子树中,那么只要找到该节点左子树中最深的节点以及右子树中最深的节点,二者之和即为左右最深节点的距离,如果对每个节点做同样的运算,取最大值,那么可以得到最远距离。重复地计算每一个节点必然提高时间复杂度,所以递归是一个不错的方式。
struct TreeNode{
int m_data;
TreeNode* m_pLeft;
TreeNode* m_pRight;
TreeNode(const int data = 0,TreeNode* left=NULL,TreeNode* right=NULL):
m_data(data),m_pLeft(left),m_pRight(right){}
};
int LongestPathRecursive(TreeNode* pNode,int& left_len,int& right_len,int& max_len)
{
if(NULL == pNode)
{
left_len = 0;
right_len = 0;
max_len = 0;
return max_len;
}
int left_left_len = 0;
int left_right_len = 0;
int left_max_len = 0;
int right_left_len = 0;
int right_right_len = 0;
int right_max_len = 0;
LongestPathRecursive(pNode->m_pLeft,left_left_len,left_right_len,left_max_len);
LongestPathRecursive(pNode->m_pRight,right_left_len,right_right_len,right_max_len);
left_len = max(left_left_len,left_right_len) + 1;
right_len = max(right_left_len,right_right_len) + 1;
max_len = max(left_left_len+right_left_len,max(left_max_len,right_max_len));
return max_len;
}
int LongestPath(TreeNode* pRoot)
{
if(!pRoot)
return -1;
int left_len = 0;
int right_len = 0;
int max_len = 0;
return LongestPathRecursive(pRoot,left_len,right_len,max_len);
}
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- 微软无线镭射简报鲨8000激光笔记本鼠标 - (2)
- 对《大家都在点赞 Windows Terminal,我决定给你泼一盆冷水》一文的商榷
- AVL树-自平衡二叉查找树(Java实现)
- 对《大家都在点赞 Windows Terminal,我决定给你泼一盆冷水》一文的商榷
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- 微软镜像下载
- 只有程序员看的懂的面试圣经|如何拿下编程面试
- 下一次技术面试时要问的 3 个重要问题
- 微软公布2013年必应搜索十大首页美图
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- 微软Word 2007数学插件 Microsoft Math 提供下载
- 有关数据库SQL递归查询在不同数据库中的实现方法
- PHP程序员面试 切忌急功近利(更需要注重以后的发展)
- C#中的递归APS和CPS模式详解
- WinForm实现按名称递归查找控件的方法