题目:
编写递归算法:求二叉树的宽度,所谓宽度指二叉树的各层中,具有最多节点数的那一层的结点总数。
二叉链表类型定义如下:
typedef struct BiTNode {
TElemType data;
struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;
要求实现下列函数:
int Width(BiTree T);
/* 求二叉树的宽度 */
思路分析:
欲求得二叉树的宽度,首先可以先求得二叉树的高度,接着,定义一个数组用于存储每一层的元素个数(递归实现求得),然后求得每一层的个数,最后再在这个数组里求出其中的最大值,即为此二叉树的宽度。
实现:
int BiTreeDepth(BiTree T) {
// 求二叉树的高度
int depthLeft, depthRight;
if (T == NULL)
return 0;
else {
depthLeft = BiTreeDepth(T->lchild); // 左子树的高度
depthRight = BiTreeDepth(T->rchild); // 右子树的高度
return 1 + (depthLeft > depthRight ? depthLeft : depthRight); // 左右子树的较大值 + 1
}
}
void WidthR(BiTree T, int a[], int i) {
// 递归求得各层的结点数
if (T != NULL) {
a[i]++;
WidthR(T->lchild, a, i+1);
WidthR(T->rchild, a, i+1);
}
}
int Width(BiTree T) {
// 求二叉树的宽度
if (T == NULL) return 0;
int high = BiTreeDepth(T);
int i,length[high+1];
for (i = 0; i <= high; i++) {
length[i] = 0; // 初始化数组length, length 数组用于存储各层所含元素个数
}
i = 0;
WidthR(T, length, i+1);
int max = length[1]; // max 为各层中结点数最多的数目
for (i = 2; i <= high; i++) {
if (max < length[i]) {
max = length[i];
}
}
return max;
}