树的非递归遍历-中序

算法思想:

  步骤一: 

    (1)、如果结点有左子树,该节点入栈

      (2)、如果该节点没有左子树,访问该节点

步骤二:

   (1)如果结点有右子树,重复步骤一

      (2)如果结点没有右子树(节点访问结束),根据栈顶指示回退,访问栈顶元素并访问右子树重复步骤一,

     (3)如果栈为空,遍历结束

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<stack>
using namespace std;
//二叉链表示法    
typedef struct BiTNode
{
	int data;
	BiTNode *lchild, *rchild;
};
typedef struct BiTNode* Bitree;

//一直往左走,找到中序遍历的起点
BiTNode * goLeft(BiTNode * root, stack<BiTNode*> &s)
{
	if (root == NULL)
	{
		return root;
	}
	//判断有没有左孩子  若没有把root return
	//如果有root入栈,再往左走
	while (root->lchild!=NULL)
	{
		s.push(root);
		root = root->lchild;
	}
	return root;
}

void InOrder2(BiTNode *root)
{
	if (root == NULL)
	{
		return;
	}
	BiTNode* t = NULL;
	stack<BiTNode*> s;
	 t=goLeft(root,s);
	 while (t)
	 {
		 printf("%d ",t->data);
		 //如果t有右子树 重复步骤1
		 if (t->rchild != NULL)
		 {
			 t = goLeft(t->rchild,s);//右子树中中序遍历的起点
		 }
		 else if (!s.empty())//如果t没有右子树更具栈顶指示回退
		 {
			 t = s.top();
			 s.pop();
		 }
		 else//如果t没有右子树 并且栈为空
		 {
			 t = NULL;
		 }
	
	 }
}
//中序遍历  
void InOrder(BiTNode *root)
{
	if (root == NULL)
	{
		return;
	}
	//遍历左子树  
	InOrder(root->lchild);
	printf("%d ", root->data);
	//遍历右子树  
	InOrder(root->rchild);
}

int main()
{
	BiTNode t1, t2, t3, t4, t5;
	memset(&t1, 0, sizeof(BiTNode));
	memset(&t2, 0, sizeof(BiTNode));
	memset(&t3, 0, sizeof(BiTNode));
	memset(&t4, 0, sizeof(BiTNode));
	memset(&t5, 0, sizeof(BiTNode));
	t1.data = 1;
	t2.data = 2;
	t3.data = 3;
	t4.data = 4;
	t5.data = 5;
	t1.lchild = &t2;
	t1.rchild = &t3;
	t2.lchild = &t4;
	t3.lchild = &t5;

	//PreOder(&t1);
	//printf("\npre\n");
	printf("\n递归遍历\n");
	InOrder(&t1);
	printf("\n非递归遍历-中序\n");
	InOrder2(&t1);
	//PostOrder(&t1);
	//printf("\npost\n");
	system("pause");  
	//LeafCount(&t1);
	//printf("叶子结点个数 %d\n", num);
	//printf("树的高度: %d\n", DepthTree(&t1));

	//BiTNode* root = CopyTree(&t1);
	//PreOder(root);
	//printf("\npre\n");
	system("pause");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值