帮我编一个遍历二叉树的程序
时间: 2023-04-10 19:04:08 浏览: 101
当然可以,以下是一个遍历二叉树的程序:
```
void traverse(TreeNode* root) {
if (root == nullptr) {
return;
}
traverse(root->left);
traverse(root->right);
// do something with root
}
```
这个程序使用递归的方式遍历二叉树,先遍历左子树,再遍历右子树,最后处理根节点。
相关问题
c语言编制中序非递归遍历二叉树程序
在C语言中,非递归遍历二叉树通常采用栈的数据结构。以下是中序遍历(先左后根右)的非递归实现,即前序遍历(左-根-右)的反转过程:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树结点
typedef struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
// 中序遍历辅助函数,将节点压入栈,然后访问左子树
void inorder_helper(TreeNode* root, Stack* stack) {
if (root == NULL) return;
// 先把左子树压入栈
inorder_helper(root->left, stack);
// 然后访问根节点
printf("%d ", root->val);
// 最后访问右子树
inorder_helper(root->right, stack);
}
// 非递归中序遍历主函数
void inorderTraversal(TreeNode* root) {
Stack stack;
stack.top = -1;
inorder_helper(root, &stack);
}
// 创建一个新的二叉树结点
TreeNode* createNode(int val) {
TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode));
node->val = val;
node->left = NULL;
node->right = NULL;
return node;
}
// 测试用例
int main() {
// 创建一个二叉树
TreeNode* root = createNode(1);
root->left = createNode(2);
root->right = createNode(3);
root->left->left = createNode(4);
root->left->right = createNode(5);
inorderTraversal(root);
return 0;
}
```
在这个程序中,`inorder_helper` 函数负责实际的遍历过程,通过递归调用自己并利用栈来模拟递归过程,实现了非递归遍历。`main` 函数创建了一个简单的二叉树,并调用 `inorderTraversal` 进行中序遍历。
如果你想了解其他类型的遍历(如后序、预序等),只需要稍微调整一下 `inorder_helper` 函数的顺序即可。
用c语言编制中序非递归遍历二叉树程序,示例一个完整代码
在C语言中,中序遍历二叉树通常采用栈来实现非递归的方式,因为栈能够帮助我们模拟递归的过程。以下是完整的非递归中序遍历二叉树的C语言代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树节点结构体
typedef struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
// 助手函数,用于将当前节点压入栈中
void push(TreeNode* node, stack_type* s) {
if (node != NULL) {
s->top = (struct Node **) realloc(s->top, (s->size + 1) * sizeof(struct Node *));
(*s).data[s->size] = node;
(*s).size++;
push(node->left, s);
}
}
// 助手函数,弹出栈顶元素并访问它
TreeNode* pop(stack_type* s) {
if (s->size > 0) {
s->size--;
return (*s).data[s->size];
} else {
printf("Stack is empty.\n");
exit(0);
}
}
// 中序遍历非递归实现
void inorderTraversal(TreeNode* root) {
stack_type s;
s.size = 0;
s.top = NULL;
TreeNode* curr = root;
// 初始化栈为空,直到遍历完所有左子树
while (curr != NULL || s.size > 0) {
// 将左子节点和空节点压入栈
while (curr != NULL) {
push(curr, &s);
curr = curr->left;
}
// 弹出栈顶节点并访问,然后移动到右子节点
curr = pop(&s);
printf("%d ", curr->val); // 访问节点值
curr = curr->right;
}
}
int main() {
// 创建一个简单的二叉树示例
TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));
root->val = 1;
root->left = (TreeNode*)malloc(sizeof(TreeNode));
root->left->val = 2;
root->right = (TreeNode*)malloc(sizeof(TreeNode));
root->right->val = 3;
root->left->left = (TreeNode*)malloc(sizeof(TreeNode));
root->left->left->val = 4;
printf("Inorder traversal using non-recursive approach:\n");
inorderTraversal(root);
free(root); // 释放内存
return 0;
}
```
在这个例子中,`inorderTraversal`函数首先将所有左子节点压入栈,然后弹出并访问栈顶节点,接着遍历其右子节点。这个过程会一直持续到栈为空并且所有的节点都被访问过。
阅读全文