// 求二叉树中节点的最大距离,编程之美3.8 #inlcude <iostream> using namespace std; struct Node { Node *lchild; Node *rchild; //data }; //因为最大距离,一定是已树中某点为根 的左右子树高度之和 int get_max_distance(tree* root,int& maxlen) { if(root==null) return 0;//空结点返回0 int Lhight = get_max_distance(root->lchild, maxlen); int Rhight = get_max_distance(root->rchild, maxlen) ; if( Lhight+Rhight > maxlen) maxlen = Lhight+Rhight ; return max(Lhight,Rhight)+1; //树的高度=max(左子树高度,右子树高度)+1 } 01 // 数据结构定义 02 struct NODE 03 { 04 NODE* pLeft; // 左子树 05 NODE* pRight; // 右子树 06 int nMaxLeft; // 左子树中的最长距离 07 int nMaxRight; // 右子树中的最长距离 08 char chValue; // 该节点的值 09 }; 10 11 int nMaxLen = 0; 12 13 // 寻找树中最长的两段距离 14 void FindMaxLen(NODE* pRoot) 15 { 16 // 遍历到叶子节点,返回 17 if(pRoot == NULL) 18 { 19 return; 20 } 21 22 // 如果左子树为空,那么该节点的左边最长距离为0 23 if(pRoot -> pLeft == NULL) 24 { 25 pRoot -> nMaxLeft = 0; 26 } 27 28 // 如果右子树为空,那么该节点的右边最长距离为0 29 if(pRoot -> pRight == NULL) 30 { 31 pRoot -> nMaxRight = 0; 32 } 33 34 // 如果左子树不为空,递归寻找左子树最长距离 35 if(pRoot -> pLeft != NULL) 36 { 37 FindMaxLen(pRoot -> pLeft); 38 } 39 40 // 如果右子树不为空,递归寻找右子树最长距离 41 if(pRoot -> pRight != NULL) 42 { 43 FindMaxLen(pRoot -> pRight); 44 } 45 46 // 计算左子树最长节点距离 47 if(pRoot -> pLeft != NULL) 48 { 49 int nTempMax = 0; 50 if(pRoot -> pLeft -> nMaxLeft > pRoot -> pLeft -> nMaxRight) 51 { 52 nTempMax = pRoot -> pLeft -> nMaxLeft; 53 } 54 else 55 { 56 nTempMax = pRoot -> pLeft -> nMaxRight; 57 } 58 pRoot -> nMaxLeft = nTempMax + 1; 59 } 60 61 // 计算右子树最长节点距离 62 if(pRoot -> pRight != NULL) 63 { 64 int nTempMax = 0; 65 if(pRoot -> pRight -> nMaxLeft > pRoot -> pRight -> nMaxRight) 66 { 67 nTempMax = pRoot -> pRight -> nMaxLeft; 68 } 69 else 70 { 71 nTempMax = pRoot -> pRight -> nMaxRight; 72 } 73 pRoot -> nMaxRight = nTempMax + 1; 74 } 75 76 // 更新最长距离 77 if(pRoot -> nMaxLeft + pRoot -> nMaxRight > nMaxLen) 78 { 79 nMaxLen = pRoot -> nMaxLeft + pRoot -> nMaxRight; 80 } 81 }