首页 > 其他分享 >二叉树的链式结构

二叉树的链式结构

时间:2024-07-07 14:02:18浏览次数:19  
标签:Node node 结点 遍历 二叉树 链式 root 结构

前言

Hello,友友们,小编将继续重新开始数据结构的学习,前面讲解了堆的部分知识,今天将讲解二叉树的链式结构的部分内容。


1.概念回顾与新增

二叉树是一种数据结构,其中每个节点最多有两个子节点,分别是左子节点和右子节点。二叉树的链式结构表示是使用指针(或引用)来连接节点,形成树形结构。每个节点包含一个数据元素和两个指向子节点的指针。

2.简单创建二叉树

分为节点的定义,创建节点,创建树

下面我们将简单的手撕一个二叉树:

typedef struct BTnode {
	int val;
	struct BTnode* left;
	struct BTnode* right;
}Node;

//节点创建
Node* BuyNode(int x) {
	Node* node = (Node*)malloc(sizeof(Node));
	if (node == NULL) {
		perror("node fail");
		return NULL;
	}
	node->val = x;
	node->left = NULL;
	node->right = NULL;
	return node;
}
//树的创建
Node* CreatTree() {
	
		Node* node1 = BuyNode(1);
		Node* node2 = BuyNode(2);
		Node* node3 = BuyNode(3);
		Node* node4 = BuyNode(4);
		Node* node5 = BuyNode(5);
		Node* node6 = BuyNode(6);

		node1->left = node2;
		node1->right = node4;
		node2->left = node3;
		node4->left = node5;
		node4->right = node6;
		return node1;
}
注意:上述代码并不是创建二叉树的方式,真正创建二叉树方式后序详解重点讲解。 二叉树建立过后,接下来我们要进行二叉树的遍历操作

3.二叉树的遍历

所谓二叉树遍历(Traversal)是按照某种特定的规则,依次对二叉树中的结点进行相应的操作,并且每个结点只操作一次。访问结点所做的操作依赖于具体的应用问题。 遍历是二叉树上最重要的运算之一,也是二叉树上进行其它运算的基础。 按照规则,二叉树的遍历有: 前序 / 中序 / 后序的递归结构遍历 : 1. 前序遍历 (Preorder Traversal 亦称先序遍历 )—— 访问根结点的操作发生在遍历其左右子树之前。 2. 中序遍历 (Inorder Traversal)—— 访问根结点的操作发生在遍历其左右子树之中(间)。 3. 后序遍历 (Postorder Traversal)—— 访问根结点的操作发生在遍历其左右子树之后。 由于被访问的结点必是某子树的根, 所以 N(Node )、 L(Left subtree )和 R(Right subtree )又可解释为, 根的左子树和根的右子树 。 NLR 、 LNR 和 LRN 分别又称为先根遍历、中根遍历和后根遍历。 注意:为了方便理解,我们将空节点都视作为NULL

3.1前序遍历

代码:
void PreOrder(Node* root) {
	if (root == NULL) {
		printf("N ");
		return;
	}
	printf("%d ", root->val);
	PreOrder(root->left);
	PreOrder(root->right);

}
递归图解: 代码递归理解: 运行结果:1 2 3 N N N 4 5 N N 6 N N 注意:中序和后序与前序的递归展开图类似,小编就不在展示了。

3.2中序遍历

void InOrder(Node* root) {
	if (root == NULL) {
		printf("N ");
		return;
	}
	InOrder(root->left);
	printf("%d ", root->val);
    InOrder(root->right);

}

运行结果:N 3 N 2 N 1 N 5 N 4 N 6 N 

3.3后序遍历

void PostOrder(Node* root) {
	if (root == NULL) {
		printf("N ");
		return;
	}
	PostOrder(root->left);
	PostOrder(root->right);
	printf("%d ", root->val);

}

运行结果:N N 3 N 2 N N 5 N N 6 4 1

3.4层序遍历

层序遍历 :除了先序遍历、中序遍历、后序遍历外,还可以对二叉树进行层序遍历。设二叉树的根结点所在层数为1 ,层序遍历就是从所在二叉树的根结点出发,首先访问第一层的树根结点,然后从左到右访问第 2 层上的结点,接着是第三层的结点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历。 层序遍历较为复杂,这里我们采用队列的方式来实现层序遍历。 这里我们简单的用动态数组实现队列,包括了队列的初始化,入队出队判空的操作。
3.4.1队列的实现
// 队列结构
typedef struct Queue {
	Node* data[MAX];
	int front;
	int rear;
} Queue;

// 初始化队列
void initQueue(Queue* q) {
	q->front = 0;
	q->rear = 0;
}

// 入队
void enqueue(Queue* q, Node* node) {
	if ((q->rear + 1) % MAX == q->front) {
		printf("Queue is full\n");
		return;
	}
	q->data[q->rear] = node;
	q->rear = (q->rear + 1) % MAX;
}

// 出队
Node* dequeue(Queue* q) {
	if (q->front == q->rear) {
		printf("Queue is empty\n");
		return NULL;
	}
	Node* node = q->data[q->front];
	q->front = (q->front + 1) % MAX;
	return node;
}

// 判断队列是否为空
int isEmpty(Queue* q) {
	return q->front == q->rear;
}
3.4.2层序遍历实现

从根节点开始,将每个节点的值打印出来,并依次将其左子节点和右子节点加入队列。

// 层序遍历函数
void levelOrder(Node* root) {
	if (root == NULL) {
		return;
	}

	Queue q;
	initQueue(&q);
	enqueue(&q, root);

	while (!isEmpty(&q)) {
		Node* node = dequeue(&q);
		printf("%d ", node->val);

		if (node->left) {
			enqueue(&q, node->left);
		}
		if (node->right) {
			enqueue(&q, node->right);
		}
	}
}

3.5主函数测试代码

int main() {
	Node* root = CreatTree();
	PreOrder(root);
	printf("\n");
	InOrder(root);
	printf("\n");
	PostOrder(root);
	printf("\n");
	levelOrder(root);
	return 0;
}

运行结果展示:

4.遍历相关选择练习

1. 某完全二叉树按层次输出(同一层从左到右)的序列为 ABCDEFGH 。该完全二叉树的前序序列为( A) A .    ABDHECFG B.    ABCDEFGH C.    HDBEAFCG D.    HDEBFGCA 2. 二叉树的先序遍历和中序遍历如下:先序遍历: EFHIGJK; 中序遍历: HFIEJKG. 则二叉树根结点为(A) A .  E                        B.   F                      C.   G                          D.   H 3. 设一课二叉树的中序遍历序列: badce ,后序遍历序列: bdeca ,则二叉树前序遍历序列为(D) A. adbce                   B. decab                C. debac                    D. abcde 4. 某二叉树的后序遍历序列与中序遍历序列相同,均为 ABCDEF ,则按层次输出(同一层从左到右)的序列 为(A) A. FEDCBA B. CBAFED C. DEFCBA D. ABCDEF

结束语

好了,本节内容到此结束了,主要对二叉树的遍历有了新的认识理解,下一节小编将介绍二叉树的相关计算操作。 最后感谢友友们的支持,动下手指给小编点点赞,发个评论吧!!!

标签:Node,node,结点,遍历,二叉树,链式,root,结构
From: https://blog.csdn.net/2302_79376097/article/details/140237157

相关文章

  • LCR 156. 序列化与反序列化二叉树
    序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列/反序列化算法执行......
  • DAY 1 数据结构与算法 (选择排序,冒泡排序,插入排序)
    1.选择排序        选择排序(SelectionSort)是一种简单直观的排序算法。其基本思想是每一次从待排序的数据元素中选择最小(或最大)的一个元素,放在已排好序的元素序列的末尾,直到全部待排序的数据元素排好序为止。即每一次设定一个数为最大或者最小值,然后与其他的数进行交......
  • 数据结构——二叉树相关题目
    1.寻找二叉树中数值为x的节点//寻找二叉树中数值为x的节点BTNode*TreeFind(BTNode*root,BTDataTypex)//传过来二叉树的地址和根的地址,以及需要查找的数据{ if(root==Null) { returnNull; }//首先需要先判断这个树是否为空,如果为空直接返回空 if(root->data=......
  • 模态荟萃:结构化的编年史
    知识截至2024年6月。1Tasks现代机器学习的Tasks基本可以划分成以下16个方向:ComputerVisionNaturalLanguageProcessingMedicalMiscellaneousMethodologyTimeSeriesGraphsSpeechAudioReasoningComputerCodePlayingGamesAdversarialRobotsKnowledgeBase......
  • [数据结构] 基于交换的排序 冒泡排序&&快速排序
    标题:[数据结构]基于交换的排序冒泡排序&&快速排序@水墨不写bug(图片来源于网络) 目录(一)冒泡排序优化后实现:(二)快速排序I、实现方法: (1)hoare法hoare法实现快排: (2)挖坑法挖坑法实现:(3)双指针法 双指针法实现:  II、快速排序复杂度分析:比较完备的快速排序实现如......
  • 数据结构题目:模式匹配的BF算法
    1、实验目的键盘输入目标串(主串)s、模式串(子串)t,编写程序,实现顺序串的BF模式匹配算法。2、实验具体要求匹配成功,输出位序,匹配不成功,显示相应提示信息。例如:s=“aababcdcccc”,t=“bcd”。3、实验设计思路(编程语言、模块划分及函数功能描述等)模块划分及函数功能描述:(1)主程序......
  • Go新手容易踩的坑(控制结构相关)
    1、忽视在range循环中元素被复制的事实修改结构体切片中的元素错误的修改方式(要注意:在range循环中,值元素是一个拷贝!)packagetestsimport("fmt""testing")typeAccountstruct{Balanceint}funcTestT1(t*testing.T){accounts:=[]Account{......
  • leetcode 257. 二叉树的所有路径
    给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。叶子节点 是指没有子节点的节点。 示例1:输入:root=[1,2,3,null,5]输出:["1->2->5","1->3"]示例2:输入:root=[1]输出:["1"]java解题思路及代码实现递归法packagecom.java......
  • leetcode 102. 二叉树的层序遍历
    给你二叉树的根节点 root ,返回其节点值的 层序遍历 。(即逐层地,从左到右访问所有节点)。示例1:输入:root=[3,9,20,null,null,15,7]输出:[[3],[9,20],[15,7]]示例2:输入:root=[1]输出:[[1]]示例3:输入:root=[]输出:[]提示:树中节点数目在范围 [0,2000] ......
  • 二叉树的顺序存储
    目录顺序存储:简介:节点的位置关系:优缺点:优点:缺点:二叉树顺序存储的模拟实现:向上调整算法:向下调整算法:二叉树的初始化:直接初始化:建堆初始化:二叉树的头删:二叉树的尾插:二叉树的取顶端元素:二叉树的判空:二叉树的销毁:完整代码:顺序存储:简介:顺序结构存储就是使......