求一棵二叉树中相距最远的两个节点之间的距离
分析可知:对于二叉树,若要两个节点U,V相距最远,有两种情况:
A. 从U节点到V节点之间的路径经过根节点
B. 从U节点到V节点之间的路径不经过根节点,这种情况下,U,V节点必定在根节点的左子树或者右子树上,这样就转化为求以根节点的孩子节点为根节点的二叉树中最远的两个节点间的距离
typedef struct Node {
struct Node *pleft; //左孩子
struct Node *pright; //右孩子
char chValue; //该节点的值
int leftMaxValue; //左子树最长距离
int rightMaxValue; //右子树最长距离
}LNode, *BinTree;
void findMaxLen(BinTree root, int *maxLen) {
//遍历到叶子结点,返回
if(root == NULL)
return;
//如果左子树为空,那么该节点左边最长距离为0
if(root->pleft == NULL)
root->leftMaxValue = 0;
//如果右子树为空,那么该节点右边最长距离为0
if(root->pright == NULL)
root->rightMaxValue = 0;
//如果左子树不为空,递归寻找左子树最长距离
if(root->pleft != NULL)
findMaxLen(root->pleft, maxLen);
//如果右子树不为空,递归寻找右子树最长距离
if(root->pright != NULL)
findMaxLen(root->pright, maxLen);
//计算左子树中距离根节点的最长距离
if(root->pleft != NULL) {
if(root->pleft->leftMaxValue > root->pleft->rightMaxValue)
root->leftMaxValue = root->pleft->leftMaxValue + 1;
else
root->leftMaxValue = root->pleft->rightMaxValue + 1;
}
//计算右子树中距离根节点的最长距离
if(root->pright != NULL) {
if(root->pright->leftMaxValue > root->pright->rightMaxValue)
root->rightMaxValue = root->pright->leftMaxValue + 1;
else
root->rightMaxValue = root->pright->rightMaxValue + 1;
}
//更新最长距离
if(root->leftMaxValue + root->rightMaxValue > *maxLen)
*maxLen = root->leftMaxValue + root->rightMaxValue;
}
- 求二叉树的最大深度。
int maxdeep(BinTree root){
if(root){
int left = maxdeep(root->left);
int right = maxdeep(root->right);
return left>right?left+1:right+1;
}else{
return 0;
}
}