首页 > 其他分享 >完全二叉树的创建与遍历

完全二叉树的创建与遍历

时间:2023-09-24 19:33:05浏览次数:28  
标签:Node 遍历 int 创建 queue 二叉树 BinTree

创建一棵完全二叉树(递归方式)(创建方法仅使用与完全二叉树)

层序遍历完全二叉树(遍历算法适用于所有二叉树):利用队列FIFO的性质

中序遍历完全二叉树(递归方式,遍历算法适用于所有二叉树)

先序遍历完全二叉树(递归方式,遍历算法适用于所有二叉树)

后序遍历完全二叉树(递归方式,遍历算法适用于所有二叉树)

代码如下(代码缺点:有malloc但是没有free,会导致程序占用过多内存)

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

/*
 * 1.递归算法创建一颗完全二叉树
 * 2.递归算法中序/先序/后序遍历一颗完全二叉树
 * 3.利用队列FIFO的特性层序遍历一颗完全二叉树
 * */
typedef struct Node {
	// 二叉树节点
	int data;
	struct Node *left;
	struct Node *right;
} Node, *BinTree;

typedef struct qNode {
	// 队列节点
	Node* treenode;
	struct qNode *next;
} qNode, *Queue;

bool isEmpty(Queue queue);
Node* delete(Queue queue);
void add(Queue queue, Node* ptr);
BinTree create(int arr[], int i, int length);  // craete a Complete Binary Tree
void accessTreeNode(Node* ptr);
void levelOrder(BinTree T, Queue queue);
void inOrder(BinTree T);
void preOrder(BinTree T);
void postOrder(BinTree T);

int main(int argc, char* argv[]) {
	// 按照层序和一个数组创建一颗完全二叉树
	int arr[] = {4, 3, 9, 8 ,2, 1};
	BinTree T = create(arr, 0, sizeof(arr)/sizeof(int));
	printf("Original     data: ");
	for (int i = 0; i < sizeof(arr)/sizeof(int); i++) {
			printf("%d ", arr[i]);
	}
	printf("\n");
	
	// 初始化一个队列
	Queue queue = (qNode*)malloc(sizeof(qNode));
	queue->treenode = NULL;
	queue->next = NULL;
	
	// 利用队列,层序遍历完全二叉树
	printf("Level Order begin: ");
	levelOrder(T, queue);
	printf("\n");	
	
	// 中序遍历二叉树
	printf("In    Order begin: ");
	inOrder(T);
	printf("\n");
	
	// 先序遍历二叉树
	printf("Pre   Order begin: ");
	preOrder(T);
	printf("\n");

	// 后序遍历二叉树
	printf("Post  Order begin: ");
	postOrder(T);
	printf("\n");
	
	return 0;
}

BinTree create(int arr[], int i, int length) {
	// 递归创建一颗完全二叉树
	BinTree T = NULL;
	if (i < length) {
		T = (Node*)malloc(sizeof(Node));
		T->data = arr[i];
		T->left = create(arr, 2*i+1, length);
		T->right = create(arr, 2*i+2, length);
	}
	return T;
}
bool isEmpty(Queue queue) {
	/*判断队列是否为空*/
	return queue->next == NULL;
}
Node* delete(Queue queue) {
	/*队头元素出队*/
	if (isEmpty(queue)) return NULL;
	qNode* p = queue->next;
	queue->next = p->next;
	Node* ret = p->treenode;  // ret保存出队元素的数据域
	free(p);
	return ret;
}
void add(Queue queue, Node* ptr) {
	/*元素在队尾入队*/
	qNode* newnode = malloc(sizeof(qNode));
	newnode->treenode = ptr;
	newnode->next = NULL;
	
	// 循环结束后,temp指向当前的队尾元素
	Queue temp = queue;
	while(temp->next != NULL) {
		temp = temp->next;
	}
	temp->next = newnode;
}
void accessTreeNode(Node* ptr) {
	/*访问完全二叉树的一个节点*/
	printf("%d ", ptr->data);
}
void levelOrder(BinTree T, Queue queue) {
	/*利用队列,层序遍历二叉树*/
	add(queue, T); // 根节点入队
	while (!isEmpty(queue)) {
		// 队头元素出队,并访问之
		Node* temp = delete(queue);
		accessTreeNode(temp);
		
		// 将该元素的孩子节点入队
		if (temp->left != NULL) add(queue, temp->left);
		if (temp->right != NULL) add(queue, temp->right);
	}
}

void inOrder(BinTree T) {
	/*中序遍历二叉树*/
	if (T != NULL) {
		inOrder(T->left);
		accessTreeNode(T);
		inOrder(T->right);
	}
}

void preOrder(BinTree T) {
	/*先序遍历二叉树*/
	if (T != NULL) {
		accessTreeNode(T);
		preOrder(T->left);
		preOrder(T->right);
	}
}

void postOrder(BinTree T) {
	/*后序遍历二叉树*/
	if (T != NULL) {
		postOrder(T->left);
		postOrder(T->right);
		accessTreeNode(T);
	}
}

完全二叉树图形化

输出结果

标签:Node,遍历,int,创建,queue,二叉树,BinTree
From: https://www.cnblogs.com/gjsun/p/17726483.html

相关文章

  • 创建文件系统1
    一:概述Linux系统把每个硬件都当做是一个文件,这样用户就可以用读写文件的方式实现对硬件的访问了。文件系统基于操作系统,它可以管理和组织保存在磁盘驱动器上的数据。通过文件系统,实现数据的完整性,保证读写数据的一致性,同时也实现了读写数据简单化。二:Linux中的主要文件系统以及创建......
  • 解决k8s删除pod后又重新创建了新的pod
    1、问题现象2、原因在Kubernetes中,当你删除一个Pod时,如果该Pod是由Deployment、ReplicaSet或PodController创建的,那么这个Pod会被标记为“已删除”,但实际上并不会立即从系统中删除。具体而言,当一个Pod被删除时:如果这个Pod是由Deployment创建的,那么系统会创建一个新的Replic......
  • TienChin-课程管理-创建工程
    创建方式与之前一样,如下奉上generateCourse代码。@TestvoidgenerateCourse(){Stringpath="E:\\Desktop\\TienChin\\tienchin-service\\tienchin-course\\src\\main";FastAutoGenerator.create("jdbc:mysql://localhost:......
  • visual studio2019创建管理系统的数据库
    1、打开服务资源管理器然后选择sqlserver数据库文件:自定义数据库名称:显示不存在之后,选择创建即可,然后就看到服务资源管理器这里出现:2、右键表-->添加新表然后新建一个名为UserTable的表,存放用户数据信息,字段名为:UId、UName、UPhone、UAddress、UPassword:然后点击左......
  • TienChin-课程管理-数据表创建
    CREATETABLE`tienchin_course`(`course_id`intNOTNULLAUTO_INCREMENTCOMMENT'课程ID',`type`intNULLCOMMENT&......
  • 创建进程的三种方式
    Java中创建线程主要有三种方式,分别为继承Thread类、实现Runnable接口、实现Callable接口。一、继承Thread类继承Thread类,重写run()方法,调用start()方法启动线程publicclassThreadTest{ publicstaticclassMyThreadextendsThread{@Overridepublicvoid......
  • 代码随想录算法训练营day17 | ● 110.平衡二叉树 ● 257. 二叉树的所有路径 ● 404.
    110.平衡二叉树classSolution{public:intgetHeight(TreeNode*node){if(node==NULL)return0;intleftHeight=getHeight(node->left);if(leftHeight==-1)return-1;intrightHeigh......
  • 在Python中创建相关系数矩阵的6种方法
    相关系数矩阵(Correlationmatrix)是数据分析的基本工具。它们让我们了解不同的变量是如何相互关联的。在Python中,有很多个方法可以计算相关系数矩阵,今天我们来对这些方法进行一个总结PandasPandas的DataFrame对象可以使用corr方法直接创建相关矩阵。由于数据科学领域的大多数人都......
  • 最优二叉树(Huffman 树)
    题目\(k\)叉树\(T\)有\(n\)片树叶。每片树叶\(v_i\)的权为\(w_i\),深度为\(l(v_i)\)。\(T\)的权值为\(W=\sumw_i\l(v_i)\)。求\(W\)的最小值。和在保证\(W\)最小的情况下,\(\maxl(v_i)\)的最小值。数据范围:\(1\len\le10^5\),\(2\lek\le10\),\(0<w_i......
  • linux命令创建文件
    Linux命令创建文件 在Linux系统中,有多种命令可以用来创建文件。下面将介绍几个常用的方法。1.使用touch命令创建文件:touch文件名该命令会创建一个空文件,如果文件已存在,则会更新文件的访问和修改时间。2.使用echo命令创建文件:echo"内容">文件名该命令会将指定的内......