实现如下图的中序遍历
利用栈实现中序遍历:
声明二维数组 类型为 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;
}
}
}
程序运行结果: