已知一棵含有n个节点的二叉树,按顺序方式存储,设计用先序遍历二叉树中结点的递归和非递归算法C语言
时间: 2024-03-27 09:36:50 浏览: 83
以下是先序遍历二叉树的递归和非递归算法的C语言代码实现:
递归算法:
```c
// 定义二叉树结点结构体
typedef struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
// 先序遍历二叉树的递归算法
void preorderTraversal(TreeNode* root) {
if (root == NULL) {
return;
}
printf("%d ", root->val); // 先访问当前结点
preorderTraversal(root->left); // 再访问左子树
preorderTraversal(root->right); // 最后访问右子树
}
```
非递归算法:
```c
// 定义栈结构体
typedef struct Stack {
TreeNode* data[10000];
int top;
} Stack;
// 初始化栈
void init(Stack* s) {
s->top = -1;
}
// 判断栈是否为空
int isEmpty(Stack* s) {
return s->top == -1;
}
// 入栈
void push(Stack* s, TreeNode* node) {
s->top++;
s->data[s->top] = node;
}
// 出栈
TreeNode* pop(Stack* s) {
TreeNode* node = s->data[s->top];
s->top--;
return node;
}
// 先序遍历二叉树的非递归算法
void preorderTraversal(TreeNode* root) {
if (root == NULL) {
return;
}
Stack s;
init(&s); // 初始化栈
push(&s, root); // 根结点入栈
while (!isEmpty(&s)) {
TreeNode* node = pop(&s);
printf("%d ", node->val); // 访问当前结点
if (node->right != NULL) { // 右子树入栈
push(&s, node->right);
}
if (node->left != NULL) { // 左子树入栈
push(&s, node->left);
}
}
}
```
以上便是先序遍历二叉树的递归和非递归算法的C语言代码实现。
阅读全文