考研加油!!!!!!!
1.1树的重要概念
1.树是一种重要的非线性结构;在有n个结点的树中有n-1条边;
2.在结点个数为n(n>1)的各棵树中,深度最小的树的深度是多少?它有多少叶子结点?多少分支结点?深度最大的树的深度是多少?它有多少叶子结点?多少分支结点?(不是二叉树)
解:深度最小时,树的宽度最大,其深度为2,有2层;它有n-1个叶子结点,1个分支结点。
深度最大时,其深度为n,有n层,有1个叶子结点,n-1个分支结点。 (分支结点包括根结点)
3.树的总结点数N,数的分支数B, N=B+1;
4.对于一棵m叉树(设根在第一层),从0开始自上向下分层给各结点编号。问编号为K的结点的双亲结点编号是多少?问编号为K的结点的第一个子女的编号是多少?
解:1. 取下界 2.K*m+1
4.利用递归算法,计算二叉树T的高度
//求二叉树的深度(树的深度也即树的高度)
/*求二叉树高度的问题转化为:先求树的左子树的高度,再求右子树的高度,
然后返回两者的最大值加1 ,就是树的高度*/
int getDepth(BTNode *p)
{
int LD,RD;
if(p==NULL)
return 0;
else
{
LD=getDepth(p->lchild);
RD=getDepth(p->rchild);
return (LD>RD?LD:RD)+1;
}
}
5.设计一个递归算法,统计树T的结点总数
//计算一棵给定的二叉树的结点个数
/*解法一:遍历这课树,设置一个全局变量n,初值为0,每当经过一个结点,全局变量自动增加1*/
int n;
void count(BTNode *p)
{
if(p!=NULL) //采用先序遍历
{
++n;
count(p->lchild);
count(p->rchild);
}
}
/*解法二:先计算出左子树的结点数,再数出右子树的结点数*/
int count1(BTNode *p)
{
int n1,n2;
if(p==NULL) //采用后序遍历
return 0;
else
{
n1=count1(p->lchild);
n2=count1(p->rchild);
return n1+n2+1;
}
}
6.设计一个递归算法,统计树T的叶子结点个数
//计算一棵给定的二叉树的叶子结点个数
//解法一:
int m=0;
void count2(BTNode *p)
{
if(p!=NULL)
{
if(p->lchild==NULL&&p->rchild==NULL)
m++;
count2(p->lchild);
count2(p->rchild);
}
}
//解法二:
int count3(BTNode *p)
{
int n1,n2;
if(p==NULL)
return 0;
else if(p->lchild==NULL&&p->rchild==NULL)
return 1;
else
{
n1=count3(p->lchild);
n2=count3(p->rchild);
return n1+n2;
}
}