面试经典(19)--求二叉树中节点的最大距离
2014-04-08 22:51
197 查看
题目描述:写一个程序求二叉树中相距最远的两个节点之间的距离。图3-11 A和B即为所求距离最远的两个节点。
我们先作图,看能否找到规律
我们可以看到,所求的两个节点可能经过二叉树的根结点,也可能不经过二叉树的根结点。每个节点维护左右子树最大距离(叶子到当前根节点的最大距离),左子树的最大距离:max1,右子树最大距离:max2,另设所求的二叉树两个节点的最大距离是nMaxLen。如果max1+max2>nMaxLen,需要更新nMaxLen=max1+max2,遍历完整棵二叉树,我们得到nMaxLen。
代码如下:
我们先作图,看能否找到规律
我们可以看到,所求的两个节点可能经过二叉树的根结点,也可能不经过二叉树的根结点。每个节点维护左右子树最大距离(叶子到当前根节点的最大距离),左子树的最大距离:max1,右子树最大距离:max2,另设所求的二叉树两个节点的最大距离是nMaxLen。如果max1+max2>nMaxLen,需要更新nMaxLen=max1+max2,遍历完整棵二叉树,我们得到nMaxLen。
代码如下:
struct NODE { NODE *pLeft; NODE *pRight; int nMaxLeft; int nMaxRight; char data; }; int nMaxLen=0; void FindMaxLen(NODE *pRoot) { if(pRoot==NULL) return; if(pRoot->pLeft==NULL) pRoot->nMaxLeft=0; if(pRoot->pRight==NULL) pRoot->nMaxRight=0; if(pRoot->pLeft)//判定条件可省略,不影响结果,但明显不大好,因为我们对pRoot->pLeft==NULL情况已做了处理 FindMaxLen(pRoot->pLeft); if(pRoot->pRight) FindMaxLen(pRoot->pRight); if(pRoot->pLeft!=NULL)//注意()一定要加上 pRoot->nMaxLeft=1+(pRoot->pLeft->nMaxLeft>pRoot->pLeft->nMaxRight?pRoot->pLeft->nMaxLeft:pRoot->pLeft->nMaxRight); if(pRoot->pRight!=NULL) pRoot->nMaxRight=1+(pRoot->pRight->nMaxLeft>pRoot->pRight->nMaxRight?pRoot->pRight->nMaxLeft:pRoot->pRight->nMaxRight); //更新nMaxLen if(nMaxLen<pRoot->nMaxLeft+pRoot->nMaxRight) nMaxLen=pRoot->nMaxLeft+pRoot->nMaxRight; }
相关文章推荐
- 微软面试100题系列---求二叉树中节点的最大距离
- 微软等数据结构+算法面试100题(38)-- 二叉树中任意两个节点间的最大距离
- 微软面试100题之第11题 求二叉树中节点的最大距离
- 微软面试百题010——二叉树节点最大距离
- 微软面试100道之11 求二叉树中节点的最大距离
- 【每日面试题】求一个二叉树中任意两个节点间的最大距离
- 面试100题:11.求二叉树中节点的最大距离
- <编程之美>经典面试题:求二叉树节点的最大距离(我的解法,最容易理解的版本?)
- 面试100题:11.求二叉树中节点的最大距离
- [面试备忘]求二叉树中节点最大距离 & 分层遍历二叉树
- 微软面试100题之11题:求二叉树中节点的最大距离
- 编程之美读书笔记_3.8 求二叉树中节点的最大距离 和 3.10分层遍历二叉树 相关代码
- 编程之美3.8 求二叉树中节点的最大距离
- 《编程之美》:求二叉树中节点的最大距离
- 求二叉树中节点的最大距离
- 编程之美 -求二叉树中节点的最大距离
- 分享:《编程之美》求二叉树中节点的最大距离
- 《编程之美》读书笔记12: 3.8 求二叉树中节点的最大距离
- 《编程之美: 求二叉树中节点的最大距离》的另一个解法
- 求二叉树中节点的最大距离