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

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

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

相关推荐
先积累问题,再逐次解决1 天前
快速幂优美算法
算法
XiYang-DING1 天前
【LeetCode】 225.用队列实现栈
算法·leetcode·职场和发展
花月C1 天前
线性动态规划(Linear DP)
算法·动态规划·代理模式
hetao17338371 天前
2025-03-24~04-06 hetao1733837 的刷题记录
c++·算法
_深海凉_1 天前
LeetCode热题100-环形链表
算法·leetcode·链表
原来是猿1 天前
Linux进程信号详解(三):信号保存
开发语言·c++·算法
2401_892070981 天前
算法与数据结构精讲:最大子段和(暴力 / 优化 / 分治)+ 线段树从入门到实战
c++·算法·线段树·最大子段和
memcpy01 天前
LeetCode 904. 水果成篮【不定长滑窗+哈希表】1516
算法·leetcode·散列表
老四啊laosi1 天前
[双指针] 8. 四数之和
算法·leetcode·四数之和