前序、中序、后序递归、非递归方式打印二叉树

递归

前序
	void PreOrder(BNode *root)
	{
		if (root == NULL)
		{
			return;
		}
		printf("%d ", root->data); //先打印根节点
		PreOrder(root->left); //打印左子树
		PreOrder(root->right);//打印右子树
	}
中序
	void InOrder(BNode *root)
	{
		if (root == NULL)
		{
			return;
		}
		PreOrder(root->left); //先打印左子树
		printf("%d ", root->data);//打印根节点
		PreOrder(root->right);//打印右子树
	}
后序
	void PostOrder(BNode *root)
	{
		if (root == NULL)
		{
			return;
		}
		PreOrder(root->left); //先打印左子树
		PreOrder(root->right);//打印右子树
		printf("%d ", root->data);//打印根节点
	}

非递归

前序

如果不用递归的话,我们能想到的一定会用到循环,那么如何来保存这些结点?可以用栈,因为用循环,肯定要从根节点开始,当循环到某一个结点时,我们只会对该结点及其子树进行操作,就利用到了栈的特性。
在压栈的时候,一直都是先压左子树,因为在遍历中,左孩子一定在右孩子的前面
对于前序遍历,先打印根节点,因为压栈就是从根节点开始的,一直压左孩子,当左孩子为空时,就让栈顶元素出栈,并开始压右孩子

	void PreOrder(BNode *root)
	{
		Stack stack;
		StackInit(&stack);
		BNode *node = root;
		BNode *top;
		while (node != NULL || !StackEmpty(&stack))
		{
			while (node != NULL)
			{
				printf("%d ", node->data);
				StackPush(&stack, node);
				node = node->left;
			}
			top = StackTop(&stack);
			StackPop(&stack);
			node = top->right;
		}
	}
中序
	void InOrder(BNode *root)
	{
		Stack stack;
		StackInit(&stack);
		BNode *node = root;
		BNode *top;
		while (node != NULL || !StackEmpty(&stack))
		{
			while (node != NULL)
			{
				StackPush(&stack, node);
				node = node->left;
			}
			top = StackTop(&stack);
			printf("%d ", top->data);
			StackPop(&stack);
			node = top->right;
		}
	}
后序
	void PostOrder(BNode *root)
	{
		Stack stack;
		StackInit(&stack);
		BNode *node = root;
		BNode *top;
		BNode *last = NULL;
		while (node != NULL || !StackEmpty(&stack))
		{
			while (node != NULL)
			{
				StackPush(&stack, node);
				node = node->left;
			}
			top = StackTop(&stack);
			if (top->right == NULL || top->right == last)
			{
				printf("%d ", top->data);
				last = top;
				StackPop(&stack);
			}
			else
			{
				node = top->right;
			}
		}
	}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值