设计一颗二叉树,采用二叉树链表作为存储结构,完成二叉树的建立,输入完全二叉树的先序序列,求出先序,中序,后序及按层遍历序列,求所有叶子及结点总数,用#代表虚结点
时间: 2024-01-23 11:10:34 浏览: 96
二叉树_17281183_刘梦婷_splitns2_扩展先序序列_二叉树_
好的,我来帮你解答这个问题。
首先,我们需要定义二叉树的结构体:
```c
typedef struct BiTNode {
char data; // 数据域
struct BiTNode *lchild; // 左子树指针
struct BiTNode *rchild; // 右子树指针
} BiTNode, *BiTree;
```
接下来,我们可以使用递归的方式来建立这颗二叉树:
```c
BiTree createBitree()
{
char ch;
scanf("%c", &ch);
if (ch == '#') {
return NULL;
}
BiTree node = (BiTree)malloc(sizeof(BiTNode));
node->data = ch;
node->lchild = createBitree();
node->rchild = createBitree();
return node;
}
```
在建立好二叉树后,我们可以使用递归的方式来分别求出先序、中序、后序遍历序列:
```c
void preOrder(BiTree T) // 先序遍历
{
if (T != NULL) {
printf("%c ", T->data);
preOrder(T->lchild);
preOrder(T->rchild);
}
}
void inOrder(BiTree T) // 中序遍历
{
if (T != NULL) {
inOrder(T->lchild);
printf("%c ", T->data);
inOrder(T->rchild);
}
}
void postOrder(BiTree T) // 后序遍历
{
if (T != NULL) {
postOrder(T->lchild);
postOrder(T->rchild);
printf("%c ", T->data);
}
}
```
接下来,我们可以使用队列来实现按层遍历:
```c
void levelOrder(BiTree T) // 按层遍历
{
if (T == NULL) {
return;
}
Queue *queue = createQueue();
enqueue(queue, T);
while (!isEmpty(queue)) {
BiTree node = dequeue(queue);
printf("%c ", node->data);
if (node->lchild != NULL) {
enqueue(queue, node->lchild);
}
if (node->rchild != NULL) {
enqueue(queue, node->rchild);
}
}
}
```
最后,我们可以使用递归的方式来求出叶子结点和结点总数:
```c
int countLeaf(BiTree T) // 求叶子结点数
{
if (T == NULL) {
return 0;
}
if (T->lchild == NULL && T->rchild == NULL) {
return 1;
}
return countLeaf(T->lchild) + countLeaf(T->rchild);
}
int countNodes(BiTree T) // 求结点总数
{
if (T == NULL) {
return 0;
}
return 1 + countNodes(T->lchild) + countNodes(T->rchild);
}
```
完整代码如下:
阅读全文