二叉树编程实战_
非递归遍历.c
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include"LinkStack.h"
#define MY_FALSE 0
#define MY_TRUE 1
//二叉树结点
typedef struct BINARYNODE
{
char ch;
struct BINARYNODE*lchild;
struct BINARYNODE*rchild;
}BinaryNode;
//二叉树的非递归遍历
typedef struct BITREESTACKNODE
{
LinkNode node;
BinaryNode*root;
int flag;
}BiTreeStackNode;
//创建栈中的节点
BiTreeStackNode*CreateBiTreeStackNode(BinaryNode*node, int flag)
{
BiTreeStackNode*newnode = (BiTreeStackNode*)malloc(sizeof(BiTreeStackNode));
newnode->root = node;
newnode->flag;
return newnode;
}
//非递归遍历
void NonRecursion(BinaryNode*root)
{
//创建栈
LinkStack*stack = Init_LinkStack();
//把根结点扔到栈里
Push_LinkStack(stack, (LinkNode*)CreateBiTreeStackNode(root, MY_FALSE, MY_TRUE));
while (Size_LinkStack(stack)>0)
{
//先弹出栈顶元素
BiTreeStackNode*node = (BiTreeStackNode*)Top_LinkStack(stack);
Pop_LinkStack(stack);
//判断弹出的结点是否为空
if (node->root==NULL)
{
continue;
}
if (node->flag == MY_TRUE)
{
printf("%c",node->root->ch);
}
else
{
//当前结点的右节点入栈
Push_LinkStack(stack, (LinkNode*)CreateBiTreeStackNode(node->root->rchild, MY_FALSE));
//当前结点的左节点入栈
Push_LinkStack(stack, (LinkNode*)CreateBiTreeStackNode(node->root->lchild, MY_FALSE));
//当前结点入栈
node->flag = MY_TRUE;
Push_LinkStack(stack, (LinkNode*)node);
}
}
}
void Recursion(BinaryNode*root)
{
if (root == NULL)
{
return;
}
printf("%c",root->ch);
//打印左子树
Recursion(root->lchild);
//打印右子树
Recursion(root->rchild);
}
void CresteBinaryTree()
{
//创建结点
BinaryNode node1 = {
'A',NULL,NULL };
BinaryNode node2 = {
'B',NULL,NULL };
BinaryNode node3 = {
'C',NULL,NULL };
BinaryNode node4 = {
'D',NULL,NULL };
BinaryNode node5 = {
'E',NULL,NULL };
BinaryNode node6 = {
'F',NULL,NULL };
BinaryNode node7 = {
'G',NULL,NULL };
BinaryNode node8 = {
'H',NULL,NULL };
//建立结点关系
node1.lchild = &node2;
node1.rchild = &node6;
node2.rchild = &node3;
node3.lchild = &node4;
node3.rchild = &node5;
node6.rchild = &node7;
node7.lchild = &node8;
//二叉树的非递归打印
NonRecursion(&node1); printf("\n");
Recursion(&node1); printf("\n");
}
int main()
{
CresteBinaryTree();
return EXIT_SUCCESS;
}
LinkStack.c
参照之前文章的代码.....
LinkStack.h
参照之前文章的代码.....