二叉树及其存储实现C语言(附上源码)

1.什么是二叉树

        二叉树是一种特殊的树型结构,其特点是每个结点至多只有两棵子树(即二叉树不存在度大于二的结点),并且二叉树的子树有左右之分,次序不可颠倒【有序树】。 

2.二叉树的定义

二叉树T:一个有穷的结点集合。

        -这个集合可以为空;

        -若不为空,则它是由根结点和称为其左子树TL和右子树TR的 两个不相交的二叉树组成。 

 二叉树具体五种基本形态

 

 二叉树的子树有左右顺序之分 

 

3.特殊的二叉树

3.1完美二叉树(满二叉树)

每一个节点都有两个儿子节点,除了叶子节点,但是叶子节点全在一层。 

 

3.2完全二叉树 

        意思是说,对完美二叉树进行自上而下,从左到右的编号后,完全二叉树也有其对应编号的节点,但是可以缺少最后最右边几个叶子节点,但是不能缺少中间的叶子节点。 

3.3斜二叉树

 

3.4二叉排序树

左子树所有结点的关键字均小于根结点的关键字;

右子树所有结点的关键字均大于根节点的关键字;

左子树和右子树又各是一棵二叉排序树。 

也就是我们二分查找得到的那棵树:

 

3.5平衡二叉树 

树上任意一个结点的左子树和右子树的深度之差不超过一。 

 

4.二叉树的性质

4.1一个二叉树第i层最多有2的i-1次方个节点:

 

4.2一个k层二叉树最多有2的k次方-1个节点:

 

 

4.3非空二叉树上的叶结点数(n0)等于度为2的结点数(n2)加1:即n0 = n2 + 1 

 

5.二叉树的存储结构

1. 顺序存储结构

对于完全二叉树

完全二叉树:按从上至下、从左到右顺序存储 n个结点的完全二叉树的结点父子关系: 

 非根结点(序号 i > 1)的父结点的序号是 [ i / 2 ];

 结点(序号为 i )的左孩子结点的序号是 2i, (若2 i <= n,否则没有左孩子);

 结点(序号为 i )的右孩子结点的序号是 2i+1, (若2 i +1<= n,否则没有右孩子); 

 

对于一般二叉树

 也可以采用这种结构,但会造成空间浪费……

 

 

2. 链表存储 

typedef struct TreeNode *BinTree;
typedef BinTree Position;
struct TreeNode{
ElementType Data;
BinTree Left;
BinTree Right;
}

 

 

 

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二叉树是一种常见的数据结构,它由一个根节点和一系列的左右子节点组成。下面是一个使用C语言实现二叉树操作的代码示例: ```c #include <stdio.h> #include <stdlib.h> // 定义二叉树节点结构体 typedef struct TreeNode { int value; struct TreeNode* left; struct TreeNode* right; } TreeNode; // 创建新节点 TreeNode* createNode(int value) { TreeNode* newNode = malloc(sizeof(TreeNode)); newNode->value = value; newNode->left = NULL; newNode->right = NULL; return newNode; } // 插入节点 void insert(TreeNode** root, int value) { if (*root == NULL) { *root = createNode(value); } else { if (value < (*root)->value) { insert(&((*root)->left), value); } else { insert(&((*root)->right), value); } } } // 删除节点 TreeNode* delete(TreeNode* root, int value) { if (root == NULL) { return root; } if (value < root->value) { root->left = delete(root->left, value); } else if (value > root->value) { root->right = delete(root->right, value); } else { if (root->left == NULL) { TreeNode* temp = root->right; free(root); return temp; } else if (root->right == NULL) { TreeNode* temp = root->left; free(root); return temp; } TreeNode* minNode = root->right; while (minNode->left != NULL) { minNode = minNode->left; } root->value = minNode->value; root->right = delete(root->right, minNode->value); } return root; } // 先序遍历 void preOrder(TreeNode* root) { if (root != NULL) { printf("%d ", root->value); preOrder(root->left); preOrder(root->right); } } // 测试代码 int main() { TreeNode* root = NULL; insert(&root, 5); insert(&root, 3); insert(&root, 7); insert(&root, 2); insert(&root, 4); printf("先序遍历结果:"); preOrder(root); printf("\n"); root = delete(root, 3); printf("删除节点3后的先序遍历结果:"); preOrder(root); printf("\n"); return 0; } ``` 这段代码实现二叉树的插入、删除和先序遍历操作。其中,`TreeNode`结构体定义了二叉树的节点,`createNode`函数用于创建新的节点,`insert`函数用于插入节点,`delete`函数用于删除节点,`preOrder`函数用于进行先序遍历。在测试代码中,创建了一个二叉树并对其进行先序遍历操作,并删除了节点3后再进行遍历。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值