一、二叉树属性考题
1.求二叉树的高度
2.求二叉树宽度
3.求二叉树WPL(所有叶子结点带权路径长度之和)
(1)二叉树高度相关代码及分析
节点定义代码
//二叉树的结点定义(链式存储)
typedef struct BiTNode{
int data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
求高度可以想到用前序遍历参数传递
代码如下:
void PreOrder(BiTNode *root,int h)
{
int height = 0;
if(root == NULL)
return;
if(h > height)
height = h; //更新树的高度
PreOrder(root->lchild,h+1);
PreOrder(root->rchild,h+1);
}
还可以使用后序遍历求树的高度代码如下:
//使用后序遍历求树的高度
int postOrder(BiTNode *root)
{
if(root == NULL)
return 0;
int l = postOrder(root->lchild);
int r = postOrder(root->rchild);
if(l > r)
return l + 1;
else return r + 1;
}
(2)求二叉树宽度代码及分析
思路是创建一个辅助数组,表示第n层的节点个数,遍历完树之后,查找数组中最大值,最大值即为树的宽度
//使用先序遍历,求二叉树宽度
void PreOrder(BiTNode *root,int level)
{
if(root == NULL)
return;
width[level]++;//累加该层结点个数
PreOrder(root->lchild,level+1); //遍历左子树
PreOrder(root->rchild,level+1);//遍历右子树
}
int treeWidth(BiTree T)
{
for (int i = 0; i < MAX; i++) {
width[i] = 0;
PreOrder(T,0);
int max = 0;
for (int j = 0; j < MAX; ++j) {
if(width[j] >max)
max = width[j];
}
}
return max;
}
(3)求二叉树WPL(所有叶子结点带权路径长度之和)
int WPL = 0;
void PreOrder(BiTNode *T,int n)
{
if(T == NULL)
return;
if(T->lchild == NULL && T->rchild ==NULL)
{
WPL+= data * n;
}
PreOrder(T->lchild,n+1);
PreOrder(T->rchild,n+1);
}