数据结构--实现链式结构二叉树

1.链式实现

1.1定义结构

cpp 复制代码
typedef char BTDataType;
typedef struct BinaryTreeNode
{
	BTDataType data;
	struct BinaryTreeNode* left;
	struct BinaryTreeNode* right;
}BTNode; 

1.2创建⼀棵链式⼆叉树

cpp 复制代码
BTNode* BuyNode(char x)
{
	BTNode* node = (BTNode*)malloc(sizeof(BTNode));
	node->data = x;
	node->left = node->right = NULL;
	return node;
}
BTNode* createBinaryTree()
{
	BTNode* n1 = BuyNode('A');
	BTNode* n2 = BuyNode('B');
	BTNode* n3 = BuyNode('C');
	BTNode* n4 = BuyNode('D');
	BTNode* n5 = BuyNode('E');
	BTNode* n6 = BuyNode('F');

	n1->left = n2;
	n1->right = n3;
	 n2->left = n4;
	n4->left = n5;
	n4->right = n6;

	return n1;
}

1.3前中后序遍历

1.3.1遍历规则

照规则,⼆叉树的遍历有:前序/中序/后序的递归结构遍历:

1)前序遍历:访问根结点的操作发⽣在遍历其左右⼦树之前

访问顺序为:根结点、左⼦树、右⼦树

2)中序遍历:访问根结点的操作发⽣在遍历其左右⼦树之中(间

访问顺序为:左⼦树、根结点、右⼦树

3)后序遍历:访问根结点的操作发⽣在遍历其左右⼦树之后

访问顺序为:左⼦树、右⼦树、根结点

前序遍历:

cpp 复制代码
void preOrder(BTNode* root)
{
 if(root==NULL)
 {
printf("NULL ");
return;
 }
printf("%c ",root->data);
preOrder(root->left);
preOrder(root->right);
}

中序遍历:

cpp 复制代码
void inorder(BTNode* root)
{
 if (root == NULL)
{
	printf("NULL ");
	return;
}
 inOrder(root->left);
 printf("%c ",root->data);
 inOrder(root->right);
}

后序遍历:

cpp 复制代码
void postOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}
	postOrder(root->left);
	postOrder(root->right);
	printf("%c ", root->data);
}

1.4⼆叉树结点个数 =根节点数+左叉树+右叉树

cpp 复制代码
int BinaryTreeSize(BTNode* root)
{
if (root == NULL)
{
	return 0;
}
return 1+BinaryTreeSize(root->left)+BinaryTreeSize(root->right);
}

1.5⼆叉树叶⼦结点个数

cpp 复制代码
int BinaryTreeLeafSize(BTNode* root)
{
 if(root==NULL)
 {
return 0;
 }
if(root->left==NULL&&root->right==NULL)
{
return 1;
}
return BinaryTreeLeafSize(root->left)+BinaryTreeLeafSize(root->right);

1.6⼆叉树第k层结点个数

cpp 复制代码
int BinaryTreeLevelKSize(BTNode* root, int k)
{
  if (root == NULL)
{
	return 0;
}
 if(k==1)
{
 return 1;
 }
return BinaryTreeLevelKSize(root->left,k-1)+BinaryTreeLevelKSize(root->right,k-1);

1.7⼆叉树的深度/⾼度

cpp 复制代码
int BinaryTreeDepth(BTNode* root)
{
 if (root == NULL)
{
	return 0;
}
 int leftDep=BinaryTreeDepth(root->left);
int rightDep=BinaryTreeDepth(root->right);
return 1+(leftDep>rightDep?leftDep:rightDep);
}

1.8⼆叉树查找值为x的结点

cpp 复制代码
BTNode* BinaryTreeFind(BTNode* root, BTDataType x)
{
 if (root == NULL)
{
	return;
}
 if(root->data==x)
{
return root;
}
BTNode*leftFind=BinaryTreeFind(root->left,x);
if(leftFind)
  return leftFind;
BTNode*rightFind=BinaryTreeFind(root->right,x);
if(rightFind)
  return rightFind;
return NULL;
}

1.9⼆叉树销毁

cpp 复制代码
void BinaryTreeDestory(BTNode** root)
{
 if(*root==NULL)
 {
return;
 }
BinaryTreeDestory((*root)->left);
BinaryTreeDestory((*root)->right);
free(*root);
*root=NULL;
}

1.10层序遍历

层序遍历就是从所在⼆叉树的根结点出发,⾸先访问第⼀层的树根结点,然后从左到右访问第2 层上的结点,接着是第三层的结点,以此类推,⾃上⽽下,⾃左⾄右逐层访问树的结点的过程

实现层序遍历需要额外借助数据结构:队列

cpp 复制代码
void levelOrder(BTNode* root)
{

//定义队列....
//创建和初始化队列
	Queue q;
	QueueInit(&q);
	QueuePush(&q, root);//入队列

	while (!QueueEmpty(&q))
	{
		BTNode* top = QueueFront(&q);//取队顶
		QueuePop(&q);//出队
		printf("%c ", top->data);
		if (top->left)
			QueuePush(&q, top->left);
		if (top->right)
			QueuePush(&q, top->right);
	}
	QueueDestroy(&q);
}

2.二叉树性质

给出中序遍历和前/后遍历可以确定一个二叉树结构

相关推荐
東隅已逝,桑榆非晚2 小时前
算法6. 双指针法-查找总价格为目标的两个商品
c++·学习·算法
Eyfcom3 小时前
〖物联网终端实战 01〗UWB 室内高精度定位:仓储 AGV 与人员的厘米级轨迹追踪
物联网·算法·物流系统·快递系统·跨境物流快递系统·物联网终端实战
bro_Java6663 小时前
《排序的底层逻辑:比较、交换与分治》
java·算法·排序算法
爱喝雪碧的可乐4 小时前
MATLAB
开发语言·算法·matlab
叼烟扛炮4 小时前
Linux 学习笔记(六十):单线程的逆袭——epoll 高并发服务器实战
linux·服务器·网络·笔记·学习·算法
careathers5 小时前
【数据结构】基于比较的排序算法 - 交换排序
数据结构·算法·排序算法
HUANGZHENXUAN1235 小时前
最大子矩阵和:从 O(n⁴) 到 O(n³) 的列压缩 + Kadane
c语言·前端
H.莓飛6 小时前
【C++】【STL】vector_OJ题
linux·服务器·开发语言·数据结构·c++·visual studio
Rabitebla6 小时前
【Linux操作系统】进程篇(十一):进程程序替换——从底层原理到 exec 函数族
linux·服务器·c++·笔记·学习·算法
tellmewhoisi6 小时前
深度学习0:数学知识:正态分布1
人工智能·深度学习·算法