每天学习一算法系列(11) (求二叉树中节点的最大距离)
2011-05-06 15:52
537 查看
题目:求二叉树中节点的最大距离.
如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数。
写一个程序,求一棵二叉树中相距最远的两个节点之间的距离。
题目来源于:http://topic.csdn.net/u/20101011/16/2befbfd9-f3e4-41c5-bb31-814e9615832e.html
思路一:
题目要求一颗二叉树中两个节点之间的最大距离,由于父子节点之间边是双向的,所以这道题转换为求左子树的最大深度 + 右子树的最大深度就是二叉树中节点的最大距离。
例如:以下一颗树:
5
/ /
4 8
/ /
7 12
/
10
那么它的最大距离为4,即:4-->5-->8-->12-->10.其中"-->"的个数就是最大的距离数4.
代码如下:
如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数。
写一个程序,求一棵二叉树中相距最远的两个节点之间的距离。
题目来源于:http://topic.csdn.net/u/20101011/16/2befbfd9-f3e4-41c5-bb31-814e9615832e.html
思路一:
题目要求一颗二叉树中两个节点之间的最大距离,由于父子节点之间边是双向的,所以这道题转换为求左子树的最大深度 + 右子树的最大深度就是二叉树中节点的最大距离。
例如:以下一颗树:
5
/ /
4 8
/ /
7 12
/
10
那么它的最大距离为4,即:4-->5-->8-->12-->10.其中"-->"的个数就是最大的距离数4.
代码如下:
/*---------------------------------- 代码来源于书上. Modified by yuucyf. 2011.05.06 -----------------------------------*/ // 数据结构定义 typedef struct NODE { NODE* psLeft; // 左子树 NODE* psRight; // 右子树 int nMaxLeft; // 左子树中的最长距离 int nMaxRight; // 右子树中的最长距离 int nValue; // 该节点的值 NODE() { nValue = nMaxLeft = nMaxRight = 0; psLeft = psRight = NULL; } }S_BSTNode; void AddBSTreeNode(S_BSTNode* &pRoot, int nValue) { if (NULL == pRoot) { pRoot = new S_BSTNode; assert(NULL != pRoot); pRoot->nValue = nValue; return; } if (pRoot->nValue > nValue) { AddBSTreeNode(pRoot->psLeft, nValue); } else if ( pRoot->nValue < nValue) { AddBSTreeNode(pRoot->psRight, nValue); } } void DeleteAllNode(S_BSTNode* pRoot) { if (NULL == pRoot) return; DeleteAllNode(pRoot->psLeft); DeleteAllNode(pRoot->psRight); delete pRoot; } int g_nMaxLen = 0; // 寻找树中最长的两段距离 void FindMaxLen(NODE* pRoot) { // 遍历到叶子节点,返回 if(NULL == pRoot) { return; } // 如果左子树为空,那么该节点的左边最长距离为0 if(NULL == pRoot->psLeft) { pRoot->nMaxLeft = 0; } // 如果右子树为空,那么该节点的右边最长距离为0 if(NULL == pRoot->psRight) { pRoot->nMaxRight = 0; } // 如果左子树不为空,递归寻找左子树最长距离 if(pRoot->psLeft != NULL) { FindMaxLen(pRoot->psLeft); } // 如果右子树不为空,递归寻找右子树最长距离 if(pRoot->psRight != NULL) { FindMaxLen(pRoot->psRight); } // 计算左子树最长节点距离 if(pRoot->psLeft != NULL) { int nTempMax = 0; if(pRoot->psLeft->nMaxLeft > pRoot->psLeft->nMaxRight) { nTempMax = pRoot->psLeft->nMaxLeft; } else { nTempMax = pRoot->psLeft->nMaxRight; } pRoot->nMaxLeft = nTempMax + 1; } // 计算右子树最长节点距离 if(pRoot->psRight != NULL) { int nTempMax = 0; if(pRoot->psRight->nMaxLeft > pRoot->psRight->nMaxRight) { nTempMax = pRoot->psRight->nMaxLeft; } else { nTempMax = pRoot->psRight->nMaxRight; } pRoot->nMaxRight = nTempMax + 1; } // 更新最长距离 if((pRoot->nMaxLeft + pRoot->nMaxRight) > g_nMaxLen) { g_nMaxLen = pRoot->nMaxLeft + pRoot->nMaxRight; } } int _tmain(int argc, _TCHAR* argv[]) { S_BSTNode *pRoot = NULL; AddBSTreeNode(pRoot, 5); AddBSTreeNode(pRoot, 4); AddBSTreeNode(pRoot, 8); AddBSTreeNode(pRoot, 7); AddBSTreeNode(pRoot, 12); AddBSTreeNode(pRoot, 10); FindMaxLen(pRoot); cout << "Max distance is " << g_nMaxLen << endl; DeleteAllNode(pRoot); return 0; }
相关文章推荐
- 每天学习一算法系列(34)(求一个二叉树中任意两个节点间的最大距离,两个节点的距离的定义是这两个节点间边的个数)
- 微软算法100题11 求二叉树中两节点之间的最大距离
- 算法与数据结构面试题(11)-求二叉树中节点的最大距离
- Solution 11: 二叉树中节点的最大距离
- 11.求二叉树中节点的最大距离...
- 11. 求二叉树中节点的最大距离
- 11、求二叉树中节点的最大距离...
- 11 求二叉树中节点的最大距离
- 【学习点滴-数据结构-二叉树】求二叉树两个节点之间的最大距离
- IT公司100题-11-求二叉树中节点的最大距离
- 每天学习一算法系列(32)(求一个矩阵中最大的二维矩阵(元素和最大))
- 每天学习一算法系列(35)(递归和非递归俩种方法实现二叉树的前序遍历)
- 面试100题:11.求二叉树中节点的最大距离
- 算法:求二叉树中两个节点的最大距离
- 微软等数据结构+算法面试100题(38)-- 二叉树中任意两个节点间的最大距离
- 每天学习一算法系列(5)(已知两个数组,数组里的元素有正有负,但是都是按照从小到大已经排好序,要求用尽可能小的时间复杂度编写一算法求出两个数组的最大交集)
- 11、求二叉树中节点的最大距离
- 微软面试100道之11 求二叉树中节点的最大距离
- 【从零单排之微软面试100题系列】11之二叉树中结点的最大距离
- 11.求二叉树中节点的最大距离