二叉树的存与遍历

实现如下图的中序遍历

 利用栈实现中序遍历:

声明二维数组 类型为 struct treeNode*

定义一个移动的指针节点,记录要遍历的节点

进行入栈、出栈

代码:

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

/*
	二叉树:是树形结构的一个重要类型
	二叉树特点:是每个节点最多只能有两颗子树,且有左右之分
	二叉树是n个有限元素的集合,该集合或者为空、或者由一个称为根(root)
		的元素以及两不相交的、被分别称为左子树和右子树的二叉树组成。
		当集合为空时,称该二叉树为空二叉树。在二叉树中,一个元素也称作一个节点
*/

// 1.创建二叉树的节点结构体 
struct treeNode
{
	char data;	// 数据域
	struct treeNode* LChild;	// 左子树指针
	struct treeNode* RChild;	// 右子树指针
};

// 2.创建二叉树节点	参数 给创建的节点赋值
struct treeNode* CreateNode(char data);

// 3.进行链接 当前的数节点左右指针指向那个
// 参数1:当前节点 参数2:左子树节点指针 参数3:右子树节点指针
void InsertTree(struct treeNode* curNode, struct treeNode* LChildNode, struct treeNode* RChildNode);

// 4.打印数据	参数:要打印数据的节点指针
void Print(struct treeNode* tree);

// 5.中序遍历 利用递归	参数要进行遍历的节点指针
void MidOrderByRecursion(struct treeNode* curNode);

// 6.中序遍历 通过栈实现	参数要进行遍历的节点指针
void MidOrderByStack(struct treeNode* tree);


int main()
{
	// 创建二叉树节点
	struct treeNode* A = CreateNode('A');
	struct treeNode* B = CreateNode('B');
	struct treeNode* C = CreateNode('C');
	struct treeNode* D = CreateNode('D');
	struct treeNode* E = CreateNode('E');
	struct treeNode* F = CreateNode('F');
	struct treeNode* G = CreateNode('G');
	struct treeNode* K = CreateNode('K');

	// 进行连接
	InsertTree(A, B, C);
	InsertTree(B, D, E);
	InsertTree(C, F, G);
	InsertTree(F, NULL, K);

	// 中序遍历
	MidOrderByRecursion(A);	// 递归
	printf("\n");
	MidOrderByStack(A);		// 栈

	system("pause");
	return  0;
}
// 2.创建二叉树节点	参数 给创建的节点赋值
struct treeNode* CreateNode(char data)
{
	// 创建节点 动态申请内存空间
	struct treeNode* newNode = (struct treeNode*)malloc(sizeof(struct treeNode));
	// 判空
	if (NULL == newNode)
	{
		return NULL;
	}
	// 给节点成员赋值
	newNode->data = data;
	newNode->LChild = NULL;
	newNode->RChild = NULL;
	// 返回创建成功的节点
	return newNode;

}
// 3.进行链接 当前的数节点左右指针指向那个
// 参数1:当前节点 参数2:左子树节点指针 参数3:右子树节点指针
void InsertTree(struct treeNode* curNode, struct treeNode* LChildNode, struct treeNode* RChildNode)
{
	// 检验参数 当要进行链接的节点为空时,则退出函数
	if (NULL == curNode)
	{
		return;
	}
	// 进行链接 当前节点的左指针指向左子树;右节点指针指向右子树
	curNode->LChild = LChildNode;
	curNode->RChild = RChildNode;
}
// 4.打印数据	参数:要打印数据的节点指针
void Print(struct treeNode* tree)
{
	// 检验参数合法性
	if (NULL == tree)
	{
		return;
	}
	// 打印数据
	printf("%c\t", tree->data);
}
// 5.中序遍历 利用递归	参数要进行遍历的节点指针
void MidOrderByRecursion(struct treeNode* curNode)
{
	// 注意要当数不为空的时候,才进行中序遍历
	if (NULL != curNode)
	{
		// 先遍历左,在遍历右
		MidOrderByRecursion(curNode->LChild);
		// 打印数据 遍历根节点
		Print(curNode);
		// 遍历右子树节点
		MidOrderByRecursion(curNode->RChild);
	}
}
// 6.中序遍历 通过栈实现	参数要进行遍历的节点指针
void MidOrderByStack(struct treeNode* tree)
{
	// 检验参数合法性
	if(NULL == tree)
	{
		return;
	}
	// 用数组进行入栈出栈操作
	// 声明数组 类型为 struct treeNode*
	struct treeNode* stack[10];
	// 定义变量 用于数组下标 
	int stackTop = -1;
	// 定义移动的指针 记录要进行遍历的节点
	struct treeNode* pMove = tree;
	// 循环遍历 进行入栈 出栈操作
	while (-1 != stackTop || NULL != pMove)
	{
		// 入栈
		while (NULL != pMove)
		{
			// 每次移动前,记录移动指针节点到数组中
			stack[++stackTop] = pMove;
			// 移动指针 向左移 中序遍历,向遍历左,在遍历右
			pMove = pMove->LChild;
		}
		// 出栈
		if (-1 != stackTop)
		{
			// 将数组中记录的移动指针节点赋给移动指针节点
			pMove = stack[stackTop--];
			// 打印数据
			printf("%c\t", pMove->data);
			// 移动指针向右移动 
			pMove = pMove->RChild;
		}
	}
}

程序运行结果:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值