用顺序存储结构来存储一颗具有n个结点的二叉树,编写算法实现对该二叉树进行先序遍历,输出先序遍历序列。用c语言怎么写
时间: 2023-06-16 17:02:19 浏览: 114
假设二叉树的结点结构体定义如下:
```c
typedef struct node {
int data; //结点数据
struct node *left; //左子树指针
struct node *right; //右子树指针
} Node;
```
则可以使用一个数组来存储二叉树,按照完全二叉树的顺序存储,即从上到下、从左到右存储结点。对于第i个结点,其左子树存储在2i处,右子树存储在2i+1处。
先序遍历的递归算法如下:
```c
void preorderTraversal(Node *tree, int i) {
if (i > n || tree[i] == NULL) {
return;
}
printf("%d ", tree[i]->data); //输出当前结点
preorderTraversal(tree, 2*i); //遍历左子树
preorderTraversal(tree, 2*i+1); //遍历右子树
}
```
其中,n为二叉树结点个数,tree为存储二叉树的数组,i为当前结点的下标。
相关问题
c语言实现,用顺序存储结构来存储一颗具有n个结点的二叉树,编写算法实现对该二叉树进行先序遍历,输出先序遍历序列。
以下是用顺序存储结构实现二叉树先序遍历的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
typedef int ElemType;
typedef struct {
ElemType data[MAXSIZE];
int length;
} SqList;
// 构建二叉树
void createBiTree(SqList *L, int i) {
if (i > L->length)
return;
scanf("%d", &L->data[i]);
createBiTree(L, 2 * i);
createBiTree(L, 2 * i + 1);
}
// 先序遍历
void preOrder(SqList L, int i) {
if (i <= L.length) {
printf("%d ", L.data[i]);
preOrder(L, 2 * i);
preOrder(L, 2 * i + 1);
}
}
int main() {
SqList L;
int n;
printf("请输入二叉树的结点个数:");
scanf("%d", &n);
L.length = n;
printf("请按照顺序输入二叉树的结点数据:");
createBiTree(&L, 1);
printf("先序遍历序列为:");
preOrder(L, 1);
printf("\n");
return 0;
}
```
在这个程序中,我们定义了一个结构体SqList来存储二叉树的结点数据。createBiTree函数通过递归的方式构建二叉树,preOrder函数则通过递归实现先序遍历,输出先序遍历序列。
该程序的时间复杂度为O(n),空间复杂度为O(n)。
用顺序存储结构来存储一颗具有n个结点的二叉树,编写算法实现对该二叉树进行先序遍历,输出先序遍历序列
我们可以使用数组来存储二叉树,对于第i个节点,它的左子节点存储在2i位置上,右子节点存储在2i+1位置上,父节点存储在i/2位置上。
下面是先序遍历的递归实现:
```python
def pre_order_traversal(tree, i):
if i >= len(tree) or tree[i] is None:
return
print(tree[i], end=" ")
pre_order_traversal(tree, 2*i)
pre_order_traversal(tree, 2*i+1)
```
其中,tree是存储二叉树的数组,i是当前节点的位置。
我们可以从根节点开始遍历整个树:
```python
tree = [None, 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I']
pre_order_traversal(tree, 1)
```
输出结果为:`A B D H E I C F G`,即为先序遍历序列。
阅读全文
相关推荐






