题目描述:
如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,
我们姑且定义"距离"为两节点之间边的个数。
写一个程序,求一棵二叉树中相距最远的两个节点之间的距离。
思路:递归应该是会想到的,求最大距离,这个两个节点可以同时在左子树或右子树,
或者分别在左右子树。
遍历树一般从根节点开始,可以对根节点这样考虑:
若左子树不为空,则取左子树的最大距离maxLeft;
若右子树不为空,则取右子树的最大距离maxRight;
最后的最大距离为maxLeft + maxRight;
(若有其中之一为空,则只需要考虑另外一个。)
然后,分别遍历左子树和右子树。
//定义一个结构体 struct NODE { NODE* pLeft; NODE* pRight; int MaxLen; int MaxRgt; }; NODE* pRoot; //根节点 int MaxLength; void traversal_MaxLen(NODE* pRoot) { if(pRoot == NULL) { return 0; }; if(pRoot->pLeft == NULL) { pRoot->MaxLeft = 0; } else //若左子树不为空 { int TempLen = 0; if(pRoot->pLeft->MaxLeft > pRoot->pLeft->MaxRight) //左子树上的,某一节点,往左边大,还是往右边大 { TempLen+=pRoot->pLeft->MaxLeft; } else { TempLen+=pRoot->pLeft->MaxRight; } pRoot->nMaxLeft = TempLen + 1; traversal_MaxLen(NODE* pRoot->pLeft); //此处,加上递归 } if(pRoot->pRigth == NULL) { pRoot->MaxRight = 0; } else //若右子树不为空 { int TempLen = 0; if(pRoot->pRight->MaxLeft > pRoot->pRight->MaxRight) //右子树上的,某一节点,往左边大,还是往右边大 { TempLen+=pRoot->pRight->MaxLeft; } else { TempLen+=pRoot->pRight->MaxRight; } pRoot->MaxRight = TempLen + 1; traversal_MaxLen(NODE* pRoot->pRight); //此处,加上递归 } if(pRoot->MaxLeft + pRoot->MaxRight > 0) { MaxLength=pRoot->nMaxLeft + pRoot->MaxRight; } }
Reference:
http://blog.csdn.net/v_JULY_v/article/details/6301244