二叉树的创建以及递归和非递归遍历
包含:先序、中序、后序遍历操作
// 二叉树的创建和遍历
#include <stdio.h>
#include <stdlib.h>
typedef struct treeNode
{
char data;
struct treeNode* LChild;
struct treeNode* RChild;
}TREE,*LPTREE;
// 创建一个结点
LPTREE createNode(char data)
{
LPTREE newNode = (LPTREE)malloc(sizeof(TREE));
newNode->data = data;
newNode->LChild = NULL;
newNode->RChild = NULL;
return newNode;
}
//结点之间的连接
void insertNode(LPTREE parentNode,LPTREE LChild,LPTREE RChild)
{
parentNode->LChild = LChild;
parentNode->RChild = RChild;
}
// 打印
void printNode(LPTREE curData)
{
printf("%c ",curData->data);
}
// 先序遍历 根 左 右
void preOrder(LPTREE root)
{
if(root != NULL)
{
printNode(root);
preOrder(root->LChild);
preOrder(root->RChild);
}
}
// 中序遍历 左 根 右
void midOrder(LPTREE root)
{
if(root != NULL)
{
midOrder(root->LChild);
printNode(root);
midOrder(root->RChild);
}
}
// 后序遍历 左 右 根
void lastOrder(LPTREE root)
{
if(root != NULL)
{
lastOrder(root->LChild);
lastOrder(root->RChild);
printNode(root);
}
}
// 非递归方式遍历二叉树(采用栈)
// 非递归先序遍历
void preOrderByStack(LPTREE root)
{
if(root == NULL)
{
return;
}
// 准备顺序栈
LPTREE stack[10]; //存储每次打印结点的位置
int stackTop = -1; //栈顶标记
LPTREE pMove = root; //从根结点开始
while(stackTop != -1 || pMove)
{
// 根 左 右
// 打印走过的结点并且把走过的结点入栈
while(pMove)
{
printf("%c ",pMove->data);
stackTop++;
stack[stackTop] = pMove;
pMove = pMove->LChild;
}
// 左边无路可走处理右边
if(stackTop != -1)
{
pMove = stack[stackTop];
stackTop--;
pMove = pMove->RChild;
}
}
}
// 非递归方式中序遍历
// 先移动到最左边,把走过的数据入栈 无路可走时 出栈
void minOrderByStack(LPTREE root)
{
if(root == NULL)
{
return;
}
// 准备顺序栈
LPTREE stack[10]; //存储每次打印结点的位置
int stackTop = -1; //栈顶标记
// 定义移动的指针
LPTREE pMove = root;
while (stackTop != -1 || pMove)
{
// 走到最左边把走过的元素入栈
while (pMove)
{
stackTop++;
stack[stackTop] = pMove;
pMove = pMove->LChild;
}
//出栈
if (stackTop != -1)
{
pMove = stack[stackTop];
printf("%c ",pMove->data);
stackTop--;
pMove = pMove->RChild;
}
}
}
// 非递归方式后序遍历
void lastOrderByStack(LPTREE root)
{
if (root == NULL)
{
return;
}
// 准备顺序栈
LPTREE stack[10]; //存储每次打印结点的位置
int stackTop = -1; //栈顶标记
// 定义移动的指针
LPTREE pMove = root;
LPTREE pLastVisit = NULL;
while (pMove)
{
stackTop++;
stack[stackTop] = pMove;
pMove = pMove->LChild; //一直往左边
}
while (stackTop != -1)
{
pMove = stack[stackTop];
stackTop--;
if( pMove->RChild == NULL || pMove->RChild == pLastVisit)
{
printf("%c ",pMove->data);
pLastVisit = pMove; //改变标记的位置
}
else
{
stackTop++;
stack[stackTop] = pMove;
pMove = pMove->RChild;
while (pMove)
{
stackTop++;
stack[stackTop] = pMove;
pMove = pMove->LChild;
}
}
}
}
int main()
{
LPTREE A = createNode('A');
LPTREE B = createNode('B');
LPTREE C = createNode('C');
LPTREE D = createNode('D');
LPTREE E = createNode('E');
LPTREE F = createNode('F');
LPTREE G = createNode('G');
LPTREE H = createNode('H');
insertNode(A,B,F);
insertNode(B,NULL,C);
insertNode(F,NULL,G);
insertNode(C,D,E);
insertNode(G,H,NULL);
printf("先序遍历:\n");
preOrder(A);
printf("\n非递归方式先序遍历:\n");
preOrderByStack(A);
printf("\n中序遍历:\n");
midOrder(A);
printf("\n非递归方式中序遍历:\n");
minOrderByStack(A);
printf("\n后序遍历:\n");
lastOrder(A);
printf("\n非递归方式后序遍历:\n");
lastOrderByStack(A);
printf("\n");
system("pause");
return 0;
}
结果输出如下:
先序遍历:
A B C D E F G H
非递归方式先序遍历:
A B C D E F G H
中序遍历:
B D C E A F H G
非递归方式中序遍历:
B D C E A F H G
后序遍历:
D E C B H G F A
非递归方式后序遍历:
D E C B H G F A
请按任意键继续. . .