二叉树的基本操作
首先假设一个二叉树,如果有一个父结点只有一个子结点,就将另一个置空,如果是叶子结点就将其两个都制空,输入时用‘#’代替。
通过图片可以得知先序遍历为 :ABD#G###CE##F##
二叉树的创建
typedef struct node
{
char data;
struct node* lch, * rch;
}BTNode;
void create(BTNode*& Tree) //先序输入
{
char a;
scanf("%c", &a);
if (a == '#')
Tree = NULL;
else
{
Tree = (BTNode*)malloc(sizeof(BTNode));
Tree->data = a;
create(Tree->lch);
create(Tree->rch);
}
}
二叉树的遍历
void BLtree(BTNode* tree) //先序输出,调转位置可以实现中序后序
{
if (tree)
{
printf("%c",tree->data);
BLtree(tree->lch);
BLtree(tree->rch);
}
}
查找结点数量
int countNode(BTNode* tree)//统计二叉树的结点个数
{
if (tree == NULL)
return 0;
else
return 1 + countNode(tree->lch) + countNode(tree->rch);//后序遍历
}
查找叶子结点数量
int countleaf(BTNode* tree)//叶子结点个数
{
if (tree == NULL)
return 0;
else if (tree->lch == NULL && tree->rch == NULL)
return 1;
return countleaf(tree->lch) + countleaf(tree->rch);
}
二叉树的深度
int countdeep(BTNode* tree)//二叉树的深度
{
int left, right;
if (tree == NULL)
return 0;
else
{
left = countdeep(tree->lch);
right = countdeep(tree->rch);
return left > right ? left + 1 : right + 1;
}
}
运行结果为:
void Tree()
{
BTNode* Tree = NULL;
printf("先序输入二叉树:\n");//ABD#G###CE##F##
createTree(Tree);
//先序遍历
BLtree(Tree);
printf("结点的个数为 :%d\n", countNode(Tree));
printf("叶子结点的个数为:%d\n", countleaf(Tree));
printf("总层数为%d", countdeep(Tree));
}