二叉树的遍历(C语言实现)

二叉树的结构

typedef struct TreeNode {
	char data;//数据 
	struct TreeNode *left;//左孩子 
	struct TreeNode *right;//右孩子 
}TreeNode, *BinTree;

二叉树的创建

//先序遍历初始化二叉树 
BinTree Create(BinTree T) { //传入的是拷贝的指针,对这个拷贝的指针进行了一系列处理,如果不想返回,则需用二重指针 
	char ch;
	scanf("%c", &ch);
	if (ch == '#')
	T = NULL;
	else {
		//传递的是指针,还没有开辟二叉树的存储空间 
		T = (BinTree)malloc(sizeof(TreeNode));//开辟空间 
		T->data = ch;//赋值 
		T->left = Create(T->left);//继续递归,将左儿子的空间开辟,赋值 
		T->right = Create(T->right);//继续递归,将右儿子的空间开辟,赋值	
	}
	return T; 
}
  • 主函数传递了一个自定义结构类型的指针,我们需要在函数内开辟二叉树的存储空间,再将此地址返回给外面的指针。
  • 先输入数据,根据数据判断是否开辟空间
  • 开辟空间,赋值
  • 利用递归思想将左儿子传入,继续开辟空间
  • 利用递归思想将右儿子传入,继续开辟空间
  • 如果不想返回地址,需要使用二重地址,或者指针的引用。此时我们函数内部的是拷贝过的指针,与外面的不一样。所以如果想直接对实参进行改变,需要传递指针的指针,即二重指针。 

前序遍历

void PreOrder (BinTree T){
	if (T!=NULL) { //不为空 
		printf("%c", T->data);
		PreOrder(T->left);
		PreOrder(T->right);
	}
}

中序遍历

void MidOrder (BinTree T){
	if (T!=NULL) { //不为空 
		printf("%c", T->data);
		MidOrder(T->left);
		MidOrder(T->right);
	}
}

后序遍历 

void BackOrder (BinTree T){
	if (T!=NULL) { //不为空 
		printf("%c", T->data);
		BackOrder(T->left);
		BackOrder(T->right);
	}
}

源代码

#include <iostream>
#include <queue>
#include <cstdio>
#include <cstdlib>
using namespace std;

typedef struct TreeNode {
	char data;//数据 
	struct TreeNode* left;//左孩子 
	struct TreeNode* right;//右孩子 
}TreeNode, * BinTree;

//先序遍历初始化二叉树 
BinTree Create(BinTree T) { //传入的是拷贝的指针,对这个拷贝的指针进行了一系列处理,如果不想返回,则需用二重指针 
	char ch;
	cin >> ch;
	if (ch == '#')
		T = NULL;
	else {
		//传递的是指针,还没有开辟二叉树的存储空间 
		T = (BinTree)malloc(sizeof(TreeNode));//开辟空间 
		T->data = ch;//赋值 
		T->left = Create(T->left);//继续递归,将左儿子的空间开辟,赋值 
		T->right = Create(T->right);//继续递归,将右儿子的空间开辟,赋值	
	}
	return T;
}

void PreOrder(BinTree T) {
	if (T != NULL) { //不为空 
		printf("%c", T->data);
		PreOrder(T->left);
		PreOrder(T->right);
	}
}

void MidOrder(BinTree T) {
	if (T != NULL) { //不为空 
		printf("%c", T->data);
		MidOrder(T->left);
		MidOrder(T->right);
	}
}

void BackOrder(BinTree T) {
	if (T != NULL) { //不为空 
		printf("%c", T->data);
		BackOrder(T->left);
		BackOrder(T->right);
	}
}


int main() {
	BinTree T = NULL;//定义二叉树类型的指针 
	T = Create(T);//返回被开辟的空间地址 

	printf("前序遍历\n");
	PreOrder(T);
	printf("\n");

	printf("中序遍历\n");
	MidOrder(T);
	printf("\n");

	printf("后序遍历\n");
	BackOrder(T);
	printf("\n");


	return 0;
}

/*

ABD##E##CF##G##

*/

码字不易,给个鼓励行不~

  • 29
    点赞
  • 94
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
二叉树层序遍历是一种广度优先搜索(BFS)算法,可以使用队列来实现。具体步骤如下: 1. 首先将根节点入队列。 2. 当队列不为空时,重复以下步骤: - 从队列中取出一个节点,输出该节点的值。 - 如果该节点有左子节点,将左子节点入队列。 - 如果该节点有右子节点,将右子节点入队列。 以下是二叉树层序遍历C语言实现: ```c #include <stdio.h> #include <stdlib.h> typedef struct TreeNode { int val; struct TreeNode* left; struct TreeNode* right; } TreeNode; typedef struct QueueNode { TreeNode* node; struct QueueNode* next; } QueueNode; typedef struct Queue { QueueNode* front; QueueNode* rear; } Queue; Queue* createQueue() { Queue* q = (Queue*)malloc(sizeof(Queue)); q->front = q->rear = NULL; return q; } void enqueue(Queue* q, TreeNode* node) { QueueNode* qnode = (QueueNode*)malloc(sizeof(QueueNode)); qnode->node = node; qnode->next = NULL; if (q->rear == NULL) { q->front = q->rear = qnode; } else { q->rear->next = qnode; q->rear = qnode; } } TreeNode* dequeue(Queue* q) { if (q->front == NULL) { return NULL; } TreeNode* node = q->front->node; QueueNode* temp = q->front; q->front = q->front->next; if (q->front == NULL) { q->rear = NULL; } free(temp); return node; } int isEmpty(Queue* q) { return q->front == NULL; } void levelOrder(TreeNode* root) { if (root == NULL) { return; } Queue* q = createQueue(); enqueue(q, root); while (!isEmpty(q)) { TreeNode* node = dequeue(q); printf("%d ", node->val); if (node->left != NULL) { enqueue(q, node->left); } if (node->right != NULL) { enqueue(q, node->right); } } } int main() { /* 1 / \ 2 3 / \ \ 4 5 6 */ TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode)); root->val = 1; root->left = (TreeNode*)malloc(sizeof(TreeNode)); root->left->val = 2; root->left->left = (TreeNode*)malloc(sizeof(TreeNode)); root->left->left->val = 4; root->left->left->left = NULL; root->left->left->right = NULL; root->left->right = (TreeNode*)malloc(sizeof(TreeNode)); root->left->right->val = 5; root->left->right->left = NULL; root->left->right->right = NULL; root->right = (TreeNode*)malloc(sizeof(TreeNode)); root->right->val = 3; root->right->left = NULL; root->right->right = (TreeNode*)malloc(sizeof(TreeNode)); root->right->right->val = 6; root->right->right->left = NULL; root->right->right->right = NULL; levelOrder(root); // output: 1 2 3 4 5 6 return 0; } ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值