根据链表结构实现二叉树结构
时间: 2023-07-11 08:22:07 浏览: 48
可以通过链表节点中包含左右子节点的指针来实现二叉树结构。具体实现如下:
首先定义链表节点结构体,包含一个数据成员和两个指针成员,分别指向左右子节点:
```
struct ListNode {
int val;
ListNode* left;
ListNode* right;
ListNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
```
接下来按照二叉树的规则,构建链表节点之间的关系,使其成为一棵二叉树。例如,可以按照以下方式构建一个二叉树:
```
ListNode* root = new ListNode(1);
root->left = new ListNode(2);
root->right = new ListNode(3);
root->left->left = new ListNode(4);
root->left->right = new ListNode(5);
```
这样就构建了一棵二叉树,其中根节点是1,其左子节点是2,右子节点是3,2的左子节点是4,右子节点是5。
需要注意的是,链表结构实现的二叉树与普通的数组实现不同,需要使用递归或栈等数据结构进行遍历和操作。
相关问题
c语言以二叉链表结构存储二叉树,并实现二叉树的生成和遍历
二叉链表结构是指用指针来表示二叉树中每一个节点的左右孩子以及父节点。在C语言中,可以通过定义一个结构体来实现二叉链表结构的存储。具体代码如下:
```c
#include <stdio.h>
#include <stdlib.h>
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
struct TreeNode *parent;
};
struct TreeNode* createNode(int val) {
struct TreeNode* node = (struct TreeNode*)malloc(sizeof(struct TreeNode));
node->val = val;
node->left = NULL;
node->right = NULL;
node->parent = NULL;
return node;
}
void insertNode(struct TreeNode* parent, struct TreeNode* node, int direction) {
if (direction == 0) {
parent->left = node;
} else {
parent->right = node;
}
node->parent = parent;
}
struct TreeNode* createTree(int* nums, int size) {
if (size == 0) {
return NULL;
}
struct TreeNode* root = createNode(nums[0]);
struct TreeNode* queue[size];
int front = 0;
int rear = 0;
queue[rear++] = root;
int i;
for (i = 1; i < size; i += 2) {
struct TreeNode* parent = queue[front++];
if (nums[i] != -1) {
struct TreeNode* left = createNode(nums[i]);
insertNode(parent, left, 0);
queue[rear++] = left;
}
if (i + 1 < size && nums[i + 1] != -1) {
struct TreeNode* right = createNode(nums[i + 1]);
insertNode(parent, right, 1);
queue[rear++] = right;
}
}
return root;
}
void inorderTraversal(struct TreeNode* root) {
if (root == NULL) {
return;
}
inorderTraversal(root->left);
printf("%d ", root->val);
inorderTraversal(root->right);
}
void preorderTraversal(struct TreeNode* root) {
if (root == NULL) {
return;
}
printf("%d ", root->val);
preorderTraversal(root->left);
preorderTraversal(root->right);
}
void postorderTraversal(struct TreeNode* root) {
if (root == NULL) {
return;
}
postorderTraversal(root->left);
postorderTraversal(root->right);
printf("%d ", root->val);
}
int main() {
int nums[] = {1, 2, 3, 4, 5, 6, -1, -1, -1, 7, 8};
int size = sizeof(nums) / sizeof(int);
struct TreeNode* root = createTree(nums, size);
printf("Inorder traversal: ");
inorderTraversal(root);
printf("\n");
printf("Preorder traversal: ");
preorderTraversal(root);
printf("\n");
printf("Postorder traversal: ");
postorderTraversal(root);
printf("\n");
return 0;
}
```
上述代码中,createNode函数用于创建一个节点,insertNode函数用于在父节点和子节点之间建立关联,createTree函数用于根据给定的数组创建一棵二叉树,inorderTraversal函数、preorderTraversal函数和postorderTraversal函数分别实现了中序遍历、前序遍历和后序遍历。其中,-1表示该节点为空节点。运行上述代码,输出结果如下:
```
Inorder traversal: 4 2 5 1 7 3 8 6
Preorder traversal: 1 2 4 5 3 7 8 6
Postorder traversal: 4 5 2 8 7 3 6 1
```
可以看到,中序遍历、前序遍历和后序遍历分别输出了二叉树的节点值。
二叉链表存储的二叉树算法的结构构造
二叉链表存储的二叉树算法的结构构造通常包括以下两个部分:
1. 二叉树节点结构体
二叉树节点结构体通常包含三个成员变量,分别是左子节点指针、右子节点指针和节点值。结构体定义可以如下:
```
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
};
```
2. 创建二叉树函数
创建二叉树函数通常使用递归实现,函数定义可以如下:
```
TreeNode* createBinaryTree() {
int val;
cin >> val;
if (val == -1) { // -1 表示该节点为空
return nullptr;
}
TreeNode* node = new TreeNode();
node->val = val;
node->left = createBinaryTree();
node->right = createBinaryTree();
return node;
}
```
在这个函数中,先输入当前节点的值,如果该值为 -1 则表示当前节点为空,直接返回空指针。否则,创建一个新的节点,设置节点的值为输入的值,然后递归创建左子树和右子树,并将左右子节点指针设置为递归返回的值。
这样,我们就可以使用上述结构体和函数定义来构造一个二叉链表存储的二叉树,并对其进行遍历、修改等操作。