二叉树系列——二叉树的最大距离
题目:如果我们把二叉树看做图,父子节点之间的连线看成是双向的,我们姑且定义“距离”为两个节点之间边的个数。写一个程序求一棵二叉树中相距最远的两个节点之间的距离。
如下图所示,树中相距最远的两个节点为A,B,最大距离为6。
情况A: 路径经过左子树的最深节点,通过根节点,再到右子树的最深节点。
情况B: 路径不穿过根节点,而是左子树或右子树的最大距离路径,取其大者
求二叉树的深度的代码是比较简单的,代码如下:
int DepthOfBinaryTree(BinaryTreeNode* pNode){ if (pNode==NULL) { return 0; } else{ //递归 return DepthOfBinaryTree(pNode->m_pLeft) > DepthOfBinaryTree(pNode->m_pRight) ? DepthOfBinaryTree(pNode->m_pLeft) + 1 : DepthOfBinaryTree(pNode->m_pRight) + 1; }
}
//改进的版本 int HeightOfBinaryTree(BinaryTreeNode*pNode, int&nMaxDistance){ if (pNode == NULL) return -1; //空节点的高度为-1 //递归 int nHeightOfLeftTree = HeightOfBinaryTree(pNode->m_pLeft, nMaxDistance) + 1; //左子树的的高度加1 int nHeightOfRightTree = HeightOfBinaryTree(pNode->m_pRight, nMaxDistance) + 1; //右子树的高度加1 int nDistance = nHeightOfLeftTree + nHeightOfRightTree; //距离等于左子树的高度加上右子树的高度+2 nMaxDistance = nMaxDistance > nDistance ? nMaxDistance : nDistance; //得到距离的最大值 return nHeightOfLeftTree > nHeightOfRightTree ? nHeightOfLeftTree : nHeightOfRightTree; }
立志如山 静心求实