非递归遍历需要借助栈实现,首先把所有节点的状态设为未访问0
为了实现方便,首先根节点入栈,然后进入while循环,直到栈为空
每次先栈中弹出一个元素,如果访问状态为0,将其左右儿子入栈,并将访问状态设为1,如果访问状态为1访问该结点。
非递归先序遍历,其中栈使用的是前面的企业链式栈,压栈的顺序与访问顺序相反,前序遍历(根左右),压栈为(右左根)
前序遍历ABCDEFGH 根左右
中序遍历BDCEAFGH 左根右
后序遍历DECBHGFA 左右根
#include <stdio.h>
#include <stdlib.h>
#include "LinkStack.h"
typedef struct BINARYNODE
{
char ch;
struct BINARYNODE* lchild;
struct BINARYNODE* rchild;
}BinaryNode;
typedef struct BITREESTACKNODE
{
LinkNode node;
BinaryNode* root;
int flag;
}BinTreeStackNode;
BinTreeStackNode* CreateBiTreeStackNode(BinaryNode* node, int flag)
{
BinTreeStackNode* newnode = (BinTreeStackNode*)malloc(sizeof(BinaryNode));
newnode->root = node;
newnode->flag = flag;
return newnode;
}
void NonRecursion(BinaryNode* root)
{
LinkStack* stack = Init_LinkStack();
Push_LinkStack(stack, (LinkNode*)CreateBiTreeStackNode(root, 0)); // 把根节点仍到栈
while (Size_LinkStack(stack) > 0)
{
BinTreeStackNode* node = (BinTreeStackNode*)Top_LinkStack(stack);
Pop_LinkStack(stack);
if (node->root == NULL)
{
continue;
}
if (node->flag)
{
printf("%c", node->root->ch);
}
else
{
Push_LinkStack(stack, (LinkNode*)CreateBiTreeStackNode(node->root->rchild, 0)); // 右节点入栈
Push_LinkStack(stack, (LinkNode*)CreateBiTreeStackNode(node->root->lchild, 0)); // 左节点入栈
node->flag = 1;
Push_LinkStack(stack, (LinkNode*)node);
}
}
}
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");
}
int main()
{
CresteBinaryTree();
system("pause");
return 0;
}
中序遍历
#include <stdio.h>
#include <stdlib.h>
#include "LinkStack.h"
typedef struct BINARYNODE
{
char ch;
struct BINARYNODE* lchild;
struct BINARYNODE* rchild;
}BinaryNode;
typedef struct BITREESTACKNODE
{
LinkNode node;
BinaryNode* root;
int flag;
}BinTreeStackNode;
BinTreeStackNode* CreateBiTreeStackNode(BinaryNode* node, int flag)
{
BinTreeStackNode* newnode = (BinTreeStackNode*)malloc(sizeof(BinaryNode));
newnode->root = node;
newnode->flag = flag;
return newnode;
}
void NonRecursion(BinaryNode* root)
{
LinkStack* stack = Init_LinkStack();
Push_LinkStack(stack, (LinkNode*)CreateBiTreeStackNode(root, 0)); // 把根节点仍到栈
while (Size_LinkStack(stack) > 0)
{
BinTreeStackNode* node = (BinTreeStackNode*)Top_LinkStack(stack);
Pop_LinkStack(stack);
if (node->root == NULL)
{
continue;
}
if (node->flag)
{
printf("%c", node->root->ch);
}
else
{
Push_LinkStack(stack, (LinkNode*)CreateBiTreeStackNode(node->root->rchild, 0)); // 右节点入栈
node->flag = 1;
Push_LinkStack(stack, (LinkNode*)node);
Push_LinkStack(stack, (LinkNode*)CreateBiTreeStackNode(node->root->lchild, 0)); // 左节点入栈
}
}
}
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");
}
int main()
{
CresteBinaryTree();
system("pause");
return 0;
}
后续遍历
#include <stdio.h>
#include <stdlib.h>
#include "LinkStack.h"
typedef struct BINARYNODE
{
char ch;
struct BINARYNODE* lchild;
struct BINARYNODE* rchild;
}BinaryNode;
typedef struct BITREESTACKNODE
{
LinkNode node;
BinaryNode* root;
int flag;
}BinTreeStackNode;
BinTreeStackNode* CreateBiTreeStackNode(BinaryNode* node, int flag)
{
BinTreeStackNode* newnode = (BinTreeStackNode*)malloc(sizeof(BinaryNode));
newnode->root = node;
newnode->flag = flag;
return newnode;
}
void NonRecursion(BinaryNode* root)
{
LinkStack* stack = Init_LinkStack();
Push_LinkStack(stack, (LinkNode*)CreateBiTreeStackNode(root, 0)); // 把根节点仍到栈
while (Size_LinkStack(stack) > 0)
{
BinTreeStackNode* node = (BinTreeStackNode*)Top_LinkStack(stack);
Pop_LinkStack(stack);
if (node->root == NULL)
{
continue;
}
if (node->flag)
{
printf("%c", node->root->ch);
}
else
{
node->flag = 1;
Push_LinkStack(stack, (LinkNode*)node);
Push_LinkStack(stack, (LinkNode*)CreateBiTreeStackNode(node->root->rchild, 0)); // 右节点入栈
Push_LinkStack(stack, (LinkNode*)CreateBiTreeStackNode(node->root->lchild, 0)); // 左节点入栈
}
}
}
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");
}
int main()
{
CresteBinaryTree();
system("pause");
return 0;
}