二叉树不同的存储结构所需注意的事项
时间: 2024-01-30 20:10:01 浏览: 23
二叉树有两种常见的存储结构:顺序存储结构和链式存储结构。它们各有优缺点,需要注意以下几点:
1. 顺序存储结构需要开辟相对应的空间,但是在普通二叉树中,由于只有两个元素,因此会浪费大量的空间。而链式存储结构则可以更好地利用空间。
2. 顺序存储结构的查找效率较高,时间复杂度为O(1),但是插入和删除操作的时间复杂度较高,为O(n)。而链式存储结构的插入和删除操作的时间复杂度为O(1),但是查找效率较低,时间复杂度为O(n)。
3. 在链式存储结构中,如果需要查找某个节点的父节点,可以在节点结构中再添加一个指针域,用于各个节点指向其父亲节点。
4. 在顺序存储结构中,如果需要查找某个节点的父节点,可以通过计算其下标来实现。对于下标为i的节点,其父节点的下标为(i-1)/2,左子节点的下标为2i+1,右子节点的下标为2i+2。
5. 在使用链式存储结构时,需要注意避免出现环形结构,否则会导致死循环。
相关问题
c语言程序设计二叉树,要求使用括号表示法输入二叉树并转化为二叉树的链式存储结构;横向输出二叉树;求二叉树的高度;统计二叉树中的节点个数;中序遍历该二叉树(采用递归算法);层序遍历该二叉树;【选做】判断该二叉树是否为完全二叉树;最后编写main函数对以上功能进行测试。
C语言程序设计中,二叉树是一种非常重要的数据结构。它的定义是一个有限的节点集合,该集合或者为空集,或者由一个根节点和两棵分别称为左子树和右子树的二叉树组成。下面是实现二叉树所需的相关功能:
1. 使用括号表示法输入二叉树并转化为二叉树的链式存储结构
使用括号表示法,我们可以将二叉树转化为一个字符串,从而方便对二叉树进行处理。例如,对于如下的二叉树:
```
A
/ \
B C
/ / \
D E F
```
使用括号表示法,可以将该二叉树表示为:A(B(D),C(E,F))。
接下来,我们需要将这个字符串转化为二叉树的链式存储结构。具体实现可以采用递归的方式,从字符串的第一个字符开始读取,遇到左括号就递归处理左子树,遇到右括号就递归处理右子树。
2. 横向输出二叉树
横向输出二叉树可以方便地观察该二叉树的结构。实现思路是使用中序遍历的方式,先遍历右子树,然后输出当前节点,最后遍历左子树。输出时需要考虑每个节点的深度和位置。
3. 求二叉树的高度
求二叉树的高度可以采用递归的方式实现。二叉树的高度等于左子树高度和右子树高度中较大的那个再加1。
4. 统计二叉树中的节点个数
统计二叉树中的节点个数也可以采用递归的方式实现。二叉树中节点个数等于左子树中节点个数加右子树中节点个数再加1。
5. 中序遍历该二叉树(采用递归算法)
中序遍历是指先遍历左子树,然后访问当前节点,最后遍历右子树。采用递归算法实现比较简单。
6. 层序遍历该二叉树
层序遍历是指按照从上到下、从左到右的顺序依次访问每个节点。可以使用队列来实现。
7. 判断该二叉树是否为完全二叉树
完全二叉树是指除了最后一层以外,其他层都是满的,并且最后一层上的节点都尽量靠左排列。可以采用层序遍历的方式来判断。
下面是一个简单的代码实现,仅供参考:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_TREE_SIZE 100
typedef struct BiTNode {
char data;
struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;
int CreateBiTree(BiTree *T, char *s, int *p);
void PrintTree(BiTree T, int depth);
int GetTreeHeight(BiTree T);
int CountTreeNodes(BiTree T);
void InOrderTraverse(BiTree T);
void LevelOrderTraverse(BiTree T);
int IsCompleteBinaryTree(BiTree T);
int main() {
BiTree T = NULL;
char s[MAX_TREE_SIZE];
printf("请输入二叉树的括号表示法:\n");
fgets(s, MAX_TREE_SIZE, stdin);
int p = 0;
CreateBiTree(&T, s, &p);
printf("横向输出二叉树:\n");
PrintTree(T, 0);
printf("二叉树高度:%d\n", GetTreeHeight(T));
printf("二叉树节点个数:%d\n", CountTreeNodes(T));
printf("中序遍历结果:");
InOrderTraverse(T);
printf("\n");
printf("层序遍历结果:");
LevelOrderTraverse(T);
printf("\n");
if (IsCompleteBinaryTree(T)) {
printf("该二叉树是完全二叉树\n");
} else {
printf("该二叉树不是完全二叉树\n");
}
return 0;
}
int CreateBiTree(BiTree *T, char *s, int *p) {
if (s[*p] == '\0' || s[*p] == ')') {
*T = NULL;
(*p)++;
} else if (s[*p] == '(') {
(*p)++;
if (s[*p] == ')') {
*T = NULL;
(*p)++;
} else {
*T = (BiTree)malloc(sizeof(BiTNode));
(*T)->data = s[*p];
CreateBiTree(&((*T)->lchild), s, p);
CreateBiTree(&((*T)->rchild), s, p);
}
} else {
*T = (BiTree)malloc(sizeof(BiTNode));
(*T)->data = s[*p];
(*T)->lchild = NULL;
(*T)->rchild = NULL;
(*p)++;
}
return 1;
}
void PrintTree(BiTree T, int depth) {
if (T) {
PrintTree(T->rchild, depth + 1);
for (int i = 0; i < depth; i++) {
printf(" ");
}
printf("%c\n", T->data);
PrintTree(T->lchild, depth + 1);
}
}
int GetTreeHeight(BiTree T) {
if (!T) {
return 0;
} else {
int left_height = GetTreeHeight(T->lchild);
int right_height = GetTreeHeight(T->rchild);
return left_height > right_height ? left_height + 1 : right_height + 1;
}
}
int CountTreeNodes(BiTree T) {
if (!T) {
return 0;
} else {
return CountTreeNodes(T->lchild) + CountTreeNodes(T->rchild) + 1;
}
}
void InOrderTraverse(BiTree T) {
if (T) {
InOrderTraverse(T->lchild);
printf("%c", T->data);
InOrderTraverse(T->rchild);
}
}
void LevelOrderTraverse(BiTree T) {
if (!T) {
return;
}
BiTree queue[MAX_TREE_SIZE];
int front = 0, rear = 0;
queue[rear++] = T;
while (front != rear) {
BiTree node = queue[front++];
printf("%c", node->data);
if (node->lchild) {
queue[rear++] = node->lchild;
}
if (node->rchild) {
queue[rear++] = node->rchild;
}
}
}
int IsCompleteBinaryTree(BiTree T) {
if (!T) {
return 1;
}
BiTree queue[MAX_TREE_SIZE];
int front = 0, rear = 0;
queue[rear++] = T;
while (front != rear) {
BiTree node = queue[front++];
if (!node) { // 遇到空节点,检查队列中是否还有非空节点
while (front != rear && queue[front] == NULL) {
front++;
}
if (front != rear) { // 队列中还有非空节点,则不是完全二叉树
return 0;
}
} else { // 非空节点入队
queue[rear++] = node->lchild;
queue[rear++] = node->rchild;
}
}
return 1;
}
帮我写一段c语言程序:输入二叉树的顺序存储结构的字符串,输入先序遍历、中序遍历、后序遍历的结果
好的,下面是一段可以实现你所需功能的 C 语言程序:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 100
typedef struct TreeNode {
char data;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
int findIndex(char *str, char c) {
int len = strlen(str);
for (int i = 0; i < len; i++) {
if (str[i] == c) {
return i;
}
}
return -1;
}
TreeNode *buildTree(char *preorder, char *inorder, int preStart, int inStart, int size) {
if (size <= 0) {
return NULL;
}
char rootValue = preorder[preStart];
TreeNode *root = (TreeNode *)malloc(sizeof(TreeNode));
root->data = rootValue;
int rootIndex = findIndex(inorder, rootValue);
int leftSize = rootIndex - inStart;
int rightSize = size - leftSize - 1;
root->left = buildTree(preorder, inorder, preStart + 1, inStart, leftSize);
root->right = buildTree(preorder, inorder, preStart + leftSize + 1, rootIndex + 1, rightSize);
return root;
}
void preorderTraversal(TreeNode *root, char *result, int *index) {
if (root == NULL) {
return;
}
result[(*index)++] = root->data;
preorderTraversal(root->left, result, index);
preorderTraversal(root->right, result, index);
}
void inorderTraversal(TreeNode *root, char *result, int *index) {
if (root == NULL) {
return;
}
inorderTraversal(root->left, result, index);
result[(*index)++] = root->data;
inorderTraversal(root->right, result, index);
}
void postorderTraversal(TreeNode *root, char *result, int *index) {
if (root == NULL) {
return;
}
postorderTraversal(root->left, result, index);
postorderTraversal(root->right, result, index);
result[(*index)++] = root->data;
}
int main() {
char str[MAXSIZE];
printf("请输入二叉树的顺序存储结构的字符串:\n");
scanf("%s", str);
int len = strlen(str);
char *preorder = (char *)malloc(sizeof(char) * len);
char *inorder = (char *)malloc(sizeof(char) * len);
char *postorder = (char *)malloc(sizeof(char) * len);
int index = 0;
for (int i = 0; i < len; i++) {
preorder[i] = str[i];
inorder[i] = str[i];
postorder[i] = str[i];
}
TreeNode *root = buildTree(preorder, inorder, 0, 0, len);
index = 0;
preorderTraversal(root, preorder, &index);
index = 0;
inorderTraversal(root, inorder, &index);
index = 0;
postorderTraversal(root, postorder, &index);
printf("先序遍历结果为:%s\n", preorder);
printf("中序遍历结果为:%s\n", inorder);
printf("后序遍历结果为:%s\n", postorder);
free(preorder);
free(inorder);
free(postorder);
return 0;
}
```
输入示例:
```
请输入二叉树的顺序存储结构的字符串:
ABDECFG
```
输出示例:
```
先序遍历结果为:ABDECFG
中序遍历结果为:DBEAFCG
后序遍历结果为:DEBFGCA
```