创建二叉树
代码:
// 创建二叉树,使用#
void createBiTree(BiTree& T) { //引用是为了连根节点也更改了
char ch;
scanf_s("%c", &ch,1);
if (ch == '#') // #代表虚拟节点
T = NULL; //节点直接置为空
else {
T = (BiTNode*)malloc(sizeof(BiTNode));
T->data = ch ;
createBiTree(T->left);
createBiTree(T->right);
}
}
二叉树的叶子节点
递归模型:
f
(
b
)
=
{
0
b
=
=
N
U
L
L
1
b
−
>
l
e
f
t
=
=
N
U
L
L
且
b
−
>
r
i
g
h
t
=
N
U
L
L
f
(
b
−
>
l
e
f
t
)
+
f
(
b
−
>
r
i
g
h
t
)
其
余
情
况
f(b) = \begin{cases} 0 & b == NULL \\ 1 & b->left ==NULL且 b->right = NULL \\ f(b->left)+f(b->right) & 其余情况\\ \end{cases}
f(b)=⎩⎪⎨⎪⎧01f(b−>left)+f(b−>right)b==NULLb−>left==NULL且b−>right=NULL其余情况
分析:
当二叉树为空时,叶子结点数为0;当只有一个根节点时,叶子结点数为1;其余情况,叶子节点数 = 左子树叶子节点数 + 右子树叶子节点数。
代码:
/*计算一颗二叉树中叶子节点的数量*/
int countleaf(BiTree T) {
if (T == NULL)
return 0;
else if (T->left == NULL && T->right == NULL)
return 1;
else
return countleaf(T->left) + countleaf(T->right);
}
二叉树的节点总数
递归模型:
f
(
b
)
=
{
0
b
=
=
N
U
L
L
1
b
−
>
l
e
f
t
=
=
N
U
L
L
且
b
−
>
r
i
g
h
t
=
N
U
L
L
f
(
b
−
>
l
e
f
t
)
+
f
(
b
−
>
r
i
g
h
t
)
+
1
其
余
情
况
f(b) = \begin{cases} 0 & b == NULL \\ 1 & b->left ==NULL且 b->right = NULL \\ f(b->left)+f(b->right) + 1 & 其余情况\\ \end{cases}
f(b)=⎩⎪⎨⎪⎧01f(b−>left)+f(b−>right)+1b==NULLb−>left==NULL且b−>right=NULL其余情况
分析
当二叉树为空时,结点数为0;当只有一个根节点时,结点数为1;其余情况,节点总数 = 左子节点总数 + 右子树节点总数+1。
代码:
/*计算二叉树的节点个数*/
int NodeCount(BiTree T) {
int num1, num2;
if (!T)
return 0;
else if (!T->left && !T->right)
return 1;
else {
/*num1 = NodeCount(T->left);
num2 = NodeCount(T->right);
return (num1 + num2 + 1);*/
return (NodeCount(T->left) + NodeCount(T->right) + 1);
}
}
二叉树的高度
分析
当二叉树为空时,T的深度为0;如果二叉树不为空,则分别计算其左、右子树深度,左右子树的最大深度加1就是该二叉树的深度
代码:
/*计算二叉树的深度*/
int hight(BiTree T) {
int n1, n2;
if (!T)
return 0;
else {
n1 = hight(T->left);
n2 = hight(T->right);
return (n1 >= n2 ? n1 : n2) +1; //左右子树最大值加1
}
}