二叉树的根节点返回他节点的前序遍历 c语言
时间: 2023-10-04 17:11:03 浏览: 69
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
void preorderTraversal(struct TreeNode* root){
if(root==NULL) return;
printf("%d ",root->val);
preorderTraversal(root->left);
preorderTraversal(root->right);
}
相关问题
使用C语言实现根据前序遍历和中序遍历创建二叉树的代码前序遍历数组为pre中序遍历数组为in大小为n根节点为bintree
下面是使用C语言实现根据前序遍历和中序遍历创建二叉树的代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
int findRoot(int *in, int n, int rootVal) {
int i;
for (i = 0; i < n; i++) {
if (in[i] == rootVal) {
return i;
}
}
return -1;
}
TreeNode* buildTree(int* pre, int preSize, int* in, int inSize) {
if (preSize == 0 || inSize == 0) {
return NULL;
}
TreeNode *root = (TreeNode*)malloc(sizeof(TreeNode));
int rootVal = pre[0];
int rootIndex = findRoot(in, inSize, rootVal);
root->val = rootVal;
root->left = buildTree(pre+1, rootIndex, in, rootIndex);
root->right = buildTree(pre+rootIndex+1, preSize-rootIndex-1, in+rootIndex+1, inSize-rootIndex-1);
return root;
}
void printInorder(TreeNode* node) {
if (node == NULL) {
return;
}
printInorder(node->left);
printf("%d ", node->val);
printInorder(node->right);
}
int main() {
int pre[] = {1, 2, 4, 5, 3, 6};
int in[] = {4, 2, 5, 1, 3, 6};
int n = sizeof(pre) / sizeof(pre[0]);
TreeNode *root = buildTree(pre, n, in, n);
printf("Inorder traversal of constructed tree is: ");
printInorder(root);
printf("\n");
return 0;
}
```
在这个代码中,我们定义了一个 `TreeNode` 结构体来表示二叉树节点,其中包含节点值 `val`,以及指向左右子树的指针 `left` 和 `right`。
我们首先实现一个辅助函数 `findRoot`,用于查找根节点在中序遍历数组中的位置。然后,我们实现 `buildTree` 函数来递归创建二叉树。该函数首先检查基本情况,即前序遍历数组或中序遍历数组为空,直接返回 `NULL`。否则,它创建一个新的节点作为根节点,并从前序遍历数组中获取根节点值 `rootVal`,然后在中序遍历数组中查找根节点的位置 `rootIndex`。接下来,递归创建左子树和右子树,并将它们分别赋值给根节点的 `left` 和 `right` 指针。
最后,我们定义了一个辅助函数 `printInorder`,用于打印二叉树的中序遍历结果,并在 `main` 函数中调用 `buildTree` 和 `printInorder` 来测试我们的代码。
c语言二叉树采用顺序存储结构进行前序遍历
在C语言中,如果采用顺序存储结构(如数组)来实现二叉树的前序遍历,通常的做法是利用递归或栈数据结构。由于顺序存储二叉树每个节点的左、右孩子通常是通过下标计算得出的,我们可以按照这样的规则来进行:
1. **根节点**:首先访问根节点,因为它是前序遍历的第一步。
2. **递归左子树**:对于当前访问到的节点,先处理它的左子树,即在存储节点的下一个位置寻找并访问左子节点。
3. **递归右子树**:左子树处理完毕后,再访问其右子节点,即从左子节点的下个位置开始。
例如,假设我们有一个二叉树节点的存储结构,它包括一个整数值`val`和指向左右孩子的指针`left`和`right`。前序遍历可以用以下伪代码表示:
```c
void preorder_traversal(int* tree, int size, int index=0) {
if (index < size) { // 如果还有未访问的节点
printf("%d ", tree[index].val); // 访问当前节点
preorder_traversal(tree, size, index * 2 + 1); // 遍历左子树
preorder_traversal(tree, size, index * 2 + 2); // 遍历右子树
}
}
```
这里`size`代表整个数组的长度,`index`是当前处理的节点索引。前序遍历会依次打印出节点值,并递归地对左、右子节点进行同样的操作。
阅读全文