c语言建立二叉树的算法代码
时间: 2023-12-04 09:39:35 浏览: 116
以下是C语言建立二叉树的算法代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef char tree_datatype;
typedef struct tree_t {
tree_datatype data; // 数据域
struct tree_t *lchild; // 指向左子树的结构体指针
struct tree_t *rchild; // 指向右子树的结构体指针
} bitree_t;
// 创建二叉树
bitree_t *create_bitree() {
bitree_t *root = NULL;
tree_datatype ch;
scanf("%c", &ch);
if (ch == '#') {
root = NULL;
} else {
root = (bitree_t *) malloc(sizeof(bitree_t));
root->data = ch;
root->lchild = create_bitree();
root->rchild = create_bitree();
}
return root;
}
```
相关问题
C语言建立二叉树,并实现二叉树的遍历,先序遍历采用递归算法实现,层次遍历用非递归算法来实现。
以下是 C 语言实现建立二叉树和二叉树遍历的代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树节点结构体
typedef struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
// 建立二叉树
TreeNode* buildTree(int* preorder, int preorderSize, int* inorder, int inorderSize) {
if (preorderSize == 0) {
return NULL;
}
// 前序遍历的第一个节点是根节点
int root_val = preorder[0];
TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));
root->val = root_val;
// 在中序遍历中找到根节点的位置
int idx = 0;
while (inorder[idx] != root_val) {
idx++;
}
// 递归构建左右子树
root->left = buildTree(preorder+1, idx, inorder, idx);
root->right = buildTree(preorder+idx+1, preorderSize-idx-1, inorder+idx+1, inorderSize-idx-1);
return root;
}
// 先序遍历(递归实现)
void preorderTraversal(TreeNode* root) {
if (!root) {
return;
}
printf("%d ", root->val);
preorderTraversal(root->left);
preorderTraversal(root->right);
}
// 层次遍历(非递归实现)
void levelOrder(TreeNode* root) {
if (!root) {
return;
}
TreeNode* queue[1000];
int front = 0, rear = 0;
queue[rear++] = root;
while (front < rear) {
TreeNode* node = queue[front++];
printf("%d ", node->val);
if (node->left) {
queue[rear++] = node->left;
}
if (node->right) {
queue[rear++] = node->right;
}
}
}
// 测试代码
int main() {
int preorder[] = {1, 2, 4, 5, 3, 6, 7};
int inorder[] = {4, 2, 5, 1, 6, 3, 7};
int n = sizeof(preorder) / sizeof(preorder[0]);
TreeNode* root = buildTree(preorder, n, inorder, n);
preorderTraversal(root);
printf("\n");
levelOrder(root);
return 0;
}
```
以上代码中,`buildTree` 函数通过递归方式构建二叉树,`preorderTraversal` 函数通过递归方式实现先序遍历,`levelOrder` 函数通过队列实现二叉树的层次遍历。注意在 C 语言中,需要手动分配和释放内存空间。
用c语言设计二叉树的建立、中序遍历、并将二叉链表存储转换成顺序存储的算法,算法具有通用性
好的,我来回答你的问题。
首先,我们需要设计一个二叉树的节点结构体,包含左右子节点指针和节点值:
```c
typedef struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
```
接下来,我们可以通过递归的方式来建立二叉树。具体来说,我们可以先读入节点的值,如果值为-1表示该节点为空,否则创建一个新节点,然后递归地构建左右子树:
```c
TreeNode* buildTree() {
int val;
scanf("%d", &val);
if (val == -1) {
return NULL;
}
TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode));
node->val = val;
node->left = buildTree();
node->right = buildTree();
return node;
}
```
这样,我们就可以通过读入输入的方式来构建一个二叉树。
接下来,我们可以通过中序遍历的方式来遍历二叉树。具体来说,中序遍历的顺序是左子树、根节点、右子树。我们可以通过递归的方式来实现中序遍历:
```c
void inorderTraversal(TreeNode* root) {
if (root == NULL) {
return;
}
inorderTraversal(root->left);
printf("%d ", root->val);
inorderTraversal(root->right);
}
```
最后,我们需要将二叉链表存储转换成顺序存储。对于一棵完全二叉树,我们可以将其按照层次遍历的顺序存储到一个数组中,这样就可以实现顺序存储。具体来说,我们可以使用一个队列来辅助实现层次遍历:
```c
void treeToArray(TreeNode* root, int* arr, int size) {
if (root == NULL) {
return;
}
Queue* q = createQueue(size);
int i = 0;
enqueue(q, root);
while (!isEmpty(q)) {
TreeNode* node = dequeue(q);
arr[i++] = node->val;
if (node->left) {
enqueue(q, node->left);
}
if (node->right) {
enqueue(q, node->right);
}
}
destroyQueue(q);
}
```
这样,我们就可以将二叉链表存储转换成顺序存储。
完整代码如下:
阅读全文