C语言二叉树的非递归遍历

非递归遍历需要借助栈实现,首先把所有节点的状态设为未访问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;

}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值