建立二叉树,并实现二叉树的遍历,先序遍历采用递归算法实现, 层次遍历用非递归算法来实现。详细写出每一句代码的注释
时间: 2024-03-08 09:51:10 浏览: 68
好的,下面我将为您详细介绍建立二叉树并实现遍历的过程及代码注释。
1. 建立二叉树
首先,我们需要定义二叉树的结构体,包含左右子树指针和结点值。
```c
typedef struct node
{
int data;
struct node *lchild, *rchild;
} Node, *Tree;
```
接着,我们可以通过递归的方式来构建二叉树,其中输入为当前结点的地址,输出为构建好的二叉树。
```c
Tree createTree(Tree t)
{
int val;
scanf("%d", &val); // 读入当前结点的值
if (val == -1) // 如果当前值为-1,表示该结点为空
{
t = NULL;
}
else
{
t = (Tree)malloc(sizeof(Node)); // 申请空间
t->data = val; // 存储当前结点的值
t->lchild = createTree(t->lchild); // 递归构建左子树
t->rchild = createTree(t->rchild); // 递归构建右子树
}
return t;
}
```
2. 先序遍历
先序遍历是指先访问根结点,再遍历左子树,最后遍历右子树。我们可以通过递归的方式来实现先序遍历。
```c
void preOrder(Tree t)
{
if (t == NULL) // 如果当前结点为空,直接返回
{
return;
}
printf("%d ", t->data); // 先访问根结点
preOrder(t->lchild); // 再遍历左子树
preOrder(t->rchild); // 最后遍历右子树
}
```
3. 层次遍历
层次遍历是指从上到下、从左到右依次访问每一个结点。我们可以借助队列来实现层次遍历。
```c
void levelOrder(Tree t)
{
if (t == NULL) // 如果当前结点为空,直接返回
{
return;
}
Queue q; // 定义队列
initQueue(&q); // 初始化队列
enQueue(&q, t); // 根结点入队列
while (!isEmpty(&q)) // 队列不为空时循环
{
Tree tmp = deQueue(&q); // 取出队头元素
printf("%d ", tmp->data); // 访问队头元素
if (tmp->lchild) // 左子树不为空,左子树入队列
{
enQueue(&q, tmp->lchild);
}
if (tmp->rchild) // 右子树不为空,右子树入队列
{
enQueue(&q, tmp->rchild);
}
}
}
```
其中,队列的定义和相关操作如下:
```c
typedef struct queue
{
Tree data[MAXSIZE];
int front, rear;
} Queue;
void initQueue(Queue *q)
{
q->front = q->rear = 0;
}
int isEmpty(Queue *q)
{
return q->front == q->rear;
}
int isFull(Queue *q)
{
return (q->rear + 1) % MAXSIZE == q->front;
}
void enQueue(Queue *q, Tree t)
{
if (isFull(q))
{
printf("Queue is full.\n");
return;
}
q->data[q->rear] = t;
q->rear = (q->rear + 1) % MAXSIZE;
}
Tree deQueue(Queue *q)
{
if (isEmpty(q))
{
printf("Queue is empty.\n");
return NULL;
}
Tree t = q->data[q->front];
q->front = (q->front + 1) % MAXSIZE;
return t;
}
```
这样,我们就完成了二叉树的建立和遍历。
阅读全文