【数据结构】二叉树详解(1)

⭐️ 前言

二叉树的概念性质


⭐️ 二叉树链式结构的实现

结构定义:

c 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

typedef int BinaryTreeDataType;

typedef struct BinaryTreeNode {
	BinaryTreeDataType value;
	struct BinaryTreeNode* left;
	struct BinaryTreeNode* right;
}BinaryTreeNode;

⭕️ 二叉树的遍历

按照规则,二叉树的遍历分为:前序/中序/后序的递归遍历。

  • 前序遍历(PreOrder Traversal):访问根节点的操作发生在遍历其左右子树之前。
    • 根 -> 左子树 -> 右子树
  • 中序遍历(InOrder Traversal):访问根节点的操作发生在遍历左右子树之间。
    • 左子树 -> 根 -> 右子树
  • 后序遍历(PostOrder Traversal):访问根节点的操作发生在遍历其左右子树之后。
    • 左子树 -> 右子树 -> 根


PreOrder 代码:

c 复制代码
// 前序遍历递归 根 -> 左子树 -> 右子树
void PreOrder(BinaryTreeNode* root) {
	if (root == NULL) {
		printf("# ");
		return;
	}

	printf("%d ", root->value);
	PreOrder(root->left);
	PreOrder(root->right);
}

前序递归流程图:

前序递归遍历顺序为:1 2 3 # # # 4 5 # # 6 # #

InOrder 代码:

c 复制代码
// 中序遍历递归 左子树 -> 根 -> 右子树
void InOrder(BinaryTreeNode* root) {
	if (root == NULL) {
		printf("# ");
		return;
	}

	InOrder(root->left);
	printf("%d " , root->value);
	InOrder(root->right);
}

中序递归流程图:

中序递归遍历顺序为:# 3 # 2 # 1 # 5 # 4 # 6 #

PostOrder 代码:

c 复制代码
// 后序遍历递归 左子树 -> 右子树 -> 根
void PostOrder(BinaryTreeNode* root) {
	if (root == NULL) {
		printf("# ");
		return;
	}

	PostOrder(root->left);
	PostOrder(root->right);
	printf("%d " , root->value);
}

后序递归流程图:

后序递归遍历顺序为:# # 3 # 2 # # 5 # # 6 4 1


注:# 代表空树

⭕️ 二叉树的其他接口

c 复制代码
// 节点的数量
int BinaryTreeSize(BinaryTreeNode* root);
// 叶子节点的数量
int BinaryTreeLeafSize(BinaryTreeNode* root);
// 求k层节点的个数
int BinaryTreeKLevelSize(BinaryTreeNode* root , int k);
// 二叉树中查找某个元素
BinaryTreeNode* BinaryTreeFind(BinaryTreeNode* root , BinaryTreeDataType x);

BinaryTreeSize 代码:

c 复制代码
// 节点的数量
int BinaryTreeSize(BinaryTreeNode* root) {
	if (root == NULL) {
		return 0;
	}

	return 1 + BinaryTreeSize(root->left) + BinaryTreeSize(root->right);
}

BinaryTreeSize 递归流程图:


BinaryTreeLeafSize 代码:

c 复制代码
// 叶子节点的数量
int BinaryTreeLeafSize(BinaryTreeNode* root) {
	if (root == NULL) {
		return 0;
	}

	if (root->left == NULL && root->right == NULL) {
		return 1;
	}

	return BinaryTreeLeafSize(root->left) + BinaryTreeLeafSize(root->right);
}

BinaryTreeLeafSize 递归流程图:


BinaryTreeKLevelSize 代码:

c 复制代码
// 求k层节点的个数
int BinaryTreeKLevelSize(BinaryTreeNode* root , int k) {
	assert(k >= 1);

	if (root == NULL) {
		return 0;
	}

	if (k == 1) {
		return 1;
	}

	return BinaryTreeKLevelSize(root->left , k - 1) + BinaryTreeKLevelSize(root->right , k - 1);
}

BinaryTreeKLevelSize 递归流程图:


BinaryTreeFind 代码:

c 复制代码
// 二叉树中查找某个元素
BinaryTreeNode* BinaryTreeFind(BinaryTreeNode* root , BinaryTreeDataType x) {
	if (root == NULL) {
		return NULL;
	}

	if (root->value == x) {
		return root;
	}

	BinaryTreeNode* left = BinaryTreeFind(root->left , x);
	if (left != NULL) {
		return left;
	}

	BinaryTreeNode* right = BinaryTreeFind(root->right , x);
	if (right != NULL) {
		return right;
	}

	return NULL;
}

BinaryTreeFind 递归流程图:


相关推荐
深蓝海拓3 小时前
基于QtPy (PySide6) 的PLC-HMI工程项目(十五)后续完善和改进:PLC端数据解析的防粘包、残包、废包、拆包
笔记·学习·plc
小黄蚁3 小时前
LVGL学习笔记(六)
笔记·学习
zyf1044163 小时前
暑期实践日志 Day33:整体复盘核查视频,完善剪辑成果
学习·计算机网络·剪辑·暑期实践·课题任务
01_ice3 小时前
前端学习css
前端·css·学习
疯狂打码的少年4 小时前
【数据结构】交换类排序:冒泡与快速排序
数据结构·笔记·算法·排序算法
Nil2084 小时前
leetcode 108有序数组转换为二叉搜索树
数据结构·算法·leetcode
hn小菜鸡4 小时前
LeetCode 763、划分字母区间
数据结构·算法·leetcode
for_ever_love__5 小时前
PySpark学习: 数据输出
开发语言·python·学习·spark
疯狂打码的少年5 小时前
【数据结构】哈希表:构造与冲突处理
数据结构·笔记·哈希算法·散列表
liulilittle6 小时前
llmx 学习手册 06 —— CPU 指令集优化(AVX-512 三层演进)
c++·学习·算法·ai·llm