【树】数据结构树的先序-中序-后序遍历

本文提供了C语言实现二叉树的先序、中序和后序遍历的完整代码,包括结构体定义、遍历函数以及添加左右子树的函数。示例代码展示了如何初始化一棵二叉树并进行遍历。

树的先中后序遍历代码

结构体定义

typedef int Element;

typedef struct BiNode {
	Element data; // 保存数据
	struct BiNode *lchild, * rchild; // 左孩子,右孩子
} BiNode, * BiTree;

先序遍历

// 先序遍历
void preNode(BiTree T) {
	if (T != NULL) {
		visit(T);
		preNode(T->lchild);
		preNode(T->rchild);
	}
}

中序遍历

// 中序遍历
void middleNode(BiTree T) {
	if (T != NULL) {
		middleNode(T->lchild);
		visit(T);
		middleNode(T->rchild);
	}
}

后序遍历

// 后序遍历
void lastNode(BiTree T) {
	if (T != NULL) {
		lastNode(T->lchild);
		lastNode(T->rchild);
		visit(T);
	}
}

初始化一棵树代码

形成一颗这样的树

在这里插入图片描述

BiTree init(BiTree T) {
	T = (BiTree)malloc(sizeof(struct BiNode));
	T->data = 1;
	T->lchild = NULL;
	T->rchild = NULL;
	return T;
}

int main() {
	// 树的遍历
	// 定义一个二叉树,然后再遍历
	BiTree T = NULL;
	T = init(T);
	//	插入数据
	BiTree B = insert_left(T, 2);
	BiTree C = insert_right(T, 3);
	insert_left(B, 4);
	insert_right(B, 5);
	insert_left(C, 6);
	insert_right(C, 7);
	return 0;
}

添加左子树和右子树的代码

// 添加左孩子
BiTree insert_left(BiTree T, Element data) {
	BiTree T1 = (BiTree)malloc(sizeof(struct BiNode));
	if (T1 != NULL) {
		T1->data = data;
		T1->lchild = NULL;
		T1->rchild = NULL;
		T->lchild = T1;
		return T1;
	}
	return NULL;
}


// 添加右孩子
BiTree insert_right(BiTree T, Element data) {
	BiTree T1 = (BiTree)malloc(sizeof(struct BiNode));
	if (T1 != NULL) {
		T1->data = data;
		T1->lchild = NULL;
		T1->rchild = NULL;
		T->rchild = T1;
		return T1;
	}
	return NULL;
}

查看结点

// 查看结点
void visit(BiTree T) {
	cout << T->data << endl;
}

代码整合(复制粘贴即可跑)

#include <bits/stdc++.h>
using namespace std;
typedef int Element;

typedef struct BiNode {
	Element data;
	struct BiNode *lchild, * rchild;
} BiNode, * BiTree;

BiTree init(BiTree T) {
	T = (BiTree)malloc(sizeof(struct BiNode));
	T->data = 1;
	T->lchild = NULL;
	T->rchild = NULL;
	return T;
}

// 添加左孩子
BiTree insert_left(BiTree T, Element data) {
	BiTree T1 = (BiTree)malloc(sizeof(struct BiNode));
	if (T1 != NULL) {
		T1->data = data;
		T1->lchild = NULL;
		T1->rchild = NULL;
		T->lchild = T1;
		return T1;
	}
	return NULL;
}

// 添加右孩子
BiTree insert_right(BiTree T, Element data) {
	BiTree T1 = (BiTree)malloc(sizeof(struct BiNode));
	if (T1 != NULL) {
		T1->data = data;
		T1->lchild = NULL;
		T1->rchild = NULL;
		T->rchild = T1;
		return T1;
	}
	return NULL;
}

// 查看结点
void visit(BiTree T) {
	cout << T->data << " ";
}

// 先序遍历
void preNode(BiTree T) {
	if (T != NULL) {
		visit(T);
		preNode(T->lchild);
		preNode(T->rchild);
	}
}

// 中序遍历
void middleNode(BiTree T) {
	if (T != NULL) {
		middleNode(T->lchild);
		visit(T);
		middleNode(T->rchild);
	}
}

// 后序遍历
void lastNode(BiTree T) {
	if (T != NULL) {
		lastNode(T->lchild);
		lastNode(T->rchild);
		visit(T);
	}
}

int main() {
	// 树的遍历
	// 定义一个二叉树,然后再遍历
	BiTree T = NULL;
	T = init(T);
	//	插入数据
	BiTree B = insert_left(T, 2);
	BiTree C = insert_right(T, 3);
	insert_left(B, 4);
	insert_right(B, 5);
	insert_left(C, 6);
	insert_right(C, 7);
	// 上面已经完成全部的结点了。要开始遍历了
	cout << "先序遍历结果:";
	preNode(T); // 先序遍历
	cout << endl;
	cout << "中序遍历结果:";
	middleNode(T); // 中序遍历
	cout << endl;
	cout << "后序遍历结果:";
	lastNode(T); //后序遍历
	return 0;
}

在这里插入图片描述

### 数据结构中的二叉遍历方式 #### 三种主要的遍历方式及其定义 对于二叉而言,存在三种基本的遍历方式:序遍历、中序遍历以及后序遍历。每种遍历方式都遵循特定访问节点的顺- **序遍历**指的是首处理根节点,接着依次处理左子和右子[^2]。 - **中序遍历**则是处理左子,之后才是根节点,最后才轮到右子[^3]。 - **后序遍历**意味着要等到左右两个子都被处理完毕才会去处理根节点[^3]。 这些描述可以被形象化成图表形式以便更直观理解: | 遍历类型 | 访问次 | | --- | --- | | ![Pre-order](https://upload.wikimedia.org/wikipedia/commons/thumb/d/db/Binary_tree_preorder.svg/190px-Binary_tree_preorder.svg.png) | 根 -> 左 -> 右 | | ![In-order](https://upload.wikimedia.org/wikipedia/commons/thumb/e/ec/Binary_tree_inorder.svg/190px-Binary_tree_inorder.svg.png) | 左 -> 根 -> 右 | | ![Post-order](https://upload.wikimedia.org/wikipedia/commons/thumb/f/fa/Binary_tree_postorder.svg/190px-Binary_tree_postorder.svg.png) | 左 -> 右 -> 根 | 上述表格展示了不同类型的遍历模式下各个节点之间的相对位置关系。通过观察图片可以看出,在不同的遍历策略之下,同一棵二叉上的各元素将会呈现出不一样的线性排列形态[^1]。 ```cpp // C++ 实现示例代码展示如何执行这三种遍历操作 void preOrder(Node* node){ if(node != NULL){ printf("%d ",node->key); preOrder(node->left); preOrder(node->right); } } void inOrder(Node* node){ if(node != NULL){ inOrder(node->left); printf("%d ",node->key); inOrder(node->right); } } void postOrder(Node* node){ if(node != NULL){ postOrder(node->left); postOrder(node->right); printf("%d ",node->key); } } ```
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值