本文用c++写,主要思路是使用递归求得所有节点的左右子树的深度,求左右深度的和,最后更新最大的width。
代码如下:
#include <iostream>
typedef struct tNode
{
tNode(int data){
this->data = data;
left = right = NULL;
}
int data;
struct tNode* left;
struct tNode* right;
}TreeNode;
static int g_max_width = 0;//全局变量用于记录最大宽度
int maxTreeDepth(TreeNode*root){
if(root == NULL)
return 0;
/*
* 5
* 3 10
* 8 11
* 6 9
* 最大4: 3-5-10- 8-9 或 3-5-10-8-6
*
*/
//对于每一个节点都要使用局部变量lhs和rhs,
//这样在数据量特别大的时候,存在栈内存耗尽
//最好的办法是把lhs与rhs放进TreeNode中
int lhs = root->left == NULL? 0 : maxTreeDepth(root->left)+1;
int rhs = root->right == NULL? 0 : maxTreeDepth(root->right)+1;
if(lhs + rhs > g_max_width)
g_max_width = lhs + rhs;
return lhs > rhs ? lhs:rhs;
}
int TreeWidth(TreeNode* tree){
g_max_width = 0;
maxTreeDepth(tree);
return g_max_width;
}
TreeNode* createNode(int data){
return new TreeNode(data);
}
void add_tree(TreeNode**tree,int data){
if(tree==NULL)
return ;
if(*tree == NULL){
*tree = createNode(data);
return ;
}
TreeNode*root = *tree;
if(data > root->data){
add_tree(&root->right,data);
}else {
add_tree(&root->left, data);
}
}
int main(int argc,char *argv[]){
TreeNode *tree=NULL;
/*
* 5
* 3 10
* 8 11
* 6 9
*/
//3-5-10-8-9 或 3-5-10-8-6
//width:4
add_tree(&tree,5);
add_tree(&tree,3);
add_tree(&tree,10);
add_tree(&tree,8);
add_tree(&tree,6);
add_tree(&tree,9);
add_tree(&tree,11);
std::cout<<"width:"<<TreeWidth(tree)<<std::endl;
/*
* 5
* 3 10
* 8 11
* 6 9 25
15 29
12 18
17
*/
//3-5-10-11-25-29-18-17
//width:7
add_tree(&tree,25);
add_tree(&tree,15);
add_tree(&tree,12);
add_tree(&tree,18);
add_tree(&tree,29);
add_tree(&tree,17);
std::cout<<"width:"<<TreeWidth(tree)<<std::endl;
/*
* 40
17
10 25
20
18 24
22
*/
//10-17-25-20-24-22
//width:5
TreeNode *tree1=NULL;
add_tree(&tree1,40);
add_tree(&tree1,17);
add_tree(&tree1,10);
add_tree(&tree1,25);
add_tree(&tree1,20);
add_tree(&tree1,18);
add_tree(&tree1,24);
add_tree(&tree1,22);
std::cout<<"width:"<<TreeWidth(tree1)<<std::endl;
}
代码中存在的问题我已经注释,我也在main函数中写了简单的测试,当然以上不是最优解。