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

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.二叉树性质

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

相关推荐
ab1515172 小时前
3.15二刷基础90、105、106、110
数据结构·c++·算法
C蔡博士2 小时前
最近点对问题(Closest Pair of Points)
java·python·算法
白太岁2 小时前
算法:链表:指针变化与环
数据结构·算法·链表
寻寻觅觅☆2 小时前
东华OJ-进阶题-10-分解质因数(C++)
数据结构·c++·算法
Darkwanderor2 小时前
数据结构——ST表和RMQ问题
数据结构·c++·动态规划·st表·rmq问题
是梦终空1162 小时前
模板编译期机器学习
开发语言·c++·算法
killer Curry2 小时前
Polar CTF PWN 简单(1)(持续更新)
笔记·python·算法
Han.miracle2 小时前
Lombok 构造相关核心注解全解析
java·linux·算法