数据结构—树

介绍

树是一个或多个结点的有限集合,存在一个称为根的特定结点,其余的节点被分为n个互不相干的集合,相当于电脑文件管理

双亲和孩子:A是B,C,D的双亲(父结点)

性质:

  1. 数的所有结点数等于所有结点的度数之和加1
  2. 对于度为m的树,第i层上最多有m^i-1个结点
  3. 对于高度为h,宽为m的树,最多有(m^h-1)(m-1)个结点

二叉树

性质

  1. 二叉树的第i层最多有 2^ (i-1)(i>=1)个节点
  2. 深度为K的二叉树最多有 2^k -1 (k>=1)个节点
  3. 对于任何非空的二叉树T,如果叶子结点的个数为n0,而度为2的结点数为n2,则n0=n2+1

满二叉树:深度为k且含有2^k-1给结点的二叉树,所有叶子结点都只能出现在最后一层

完全二叉树:没有左子树,不能有右子树,上层没铺满,不能有下一层

代码

在二叉树中因为要改变一级指针所以要用二级指针

复制代码
#include "stdio.h"
#include "stdlib.h"


typedef char ElemType;

typedef struct tree_node
{
	ElemType data;
	//左孩子
	struct tree_node* lchild;
	//右孩子
	struct tree_node* rchild;
}TreeNode;

typedef TreeNode* BiTree;


int idx = 0;
//树的数据
char str[] ="ABDH#K###E##CFI###G#J##";

//造树,造树需要改变一级指针,所以要用二级指针
void TreeCreate(BiTree* T)
{
	ElemType ch;
	ch = str[idx++];
	if (ch == '#')
	{
		//这里改变一级指针
		*T = NULL;
		return;
	}
	else
	{
		*T = (TreeNode*)malloc(sizeof(TreeNode));
		(*T)->data = ch;
		TreeCreate(&((*T)->lchild));
		TreeCreate(&((*T)->rchild));
	}
}





//遍历二叉树,遍历不需要改变T,所有用一级指针
void PrePrder(BiTree T)
{
	if (T == NULL)
	{
		return;
	}
	//前序遍历
	//printf("%c ", T->data);
	PrePrder(T->lchild);
	//中序遍历
	//printf("%c ", T->data);
	PrePrder(T->rchild);	
	//后序遍历
	printf("%c ", T->data);
}

void main(void)
{
	BiTree T;
	TreeCreate(&T);
	PrePrder(T);
}
相关推荐
Doraemomo2 小时前
数据结构-环形链表
java·数据结构·链表
爱跳舞的烤冷面6 小时前
自学嵌入式第22天(数据结构——哈希)
数据结构·算法·哈希算法
MC皮蛋侠客8 小时前
Redis 系列(一):全景与最小闭环——从 `SET` 命令到内存数据结构
数据结构·数据库·redis
疯狂打码的少年8 小时前
【数据结构】队列:定义、顺序队列与链式队列
数据结构·笔记
蔬菜_9 小时前
前端转全栈-day5(数组、list、set)
java·前端·数据结构·list
CV-X.WANG10 小时前
从零理解 ORB-SLAM3(二):系统全景、执行上下文与核心数据结构
数据结构
Doraemomo10 小时前
数据结构-二叉树
数据结构
爱跳舞的烤冷面10 小时前
自学嵌入式第20天(数据结构篇——队列)
数据结构
旖旎夜光11 小时前
LeetCode 202:快乐数(双指针问题) —— 题解
数据结构·c++·算法·leetcode·双指针
cpp_250112 小时前
P1113 [USACO02FEB] 杂务
数据结构·c++·算法·动态规划·图论·拓扑排序·洛谷题解