数据结构-----二叉树的非递归遍历

一、先序遍历(非递归)

1.编程思路:

        二叉树的非递归先序遍历相对与对栈 的一波操作:先判断根节点是否为空,若为空直接返回,不为空将进入以下判断,将根节点入栈,进入循环体;取栈顶元素,进行访问并对栈做出栈操作;(访问包括先将其右孩子入栈,再将其左孩子入栈,如孩子为空,则不进行入栈操作),以此方法进行循环,直至栈内无元素结束。

原二叉树图:


思维图如下所示:


2.程序代码实现:

//非递归的先序遍历二叉树
void PreOrderByLoop(TreeNode* root){
	if(root == NULL){
		//空树
		return;
	}
	//入栈
	SeqStack q;
	SeqStackInit(&q);
	SeqStackPush(&q,root);
	TreeNode value;
	while(GetStackTop(&q,&value)){
		printf("%c ",value.data);
		SeqStackPop(&q);
		if(value.rchild != NULL){
			//入栈
			SeqStackPush(&q,value.rchild);
		}
		if(value.lchild != NULL){
			//入栈
			SeqStackPush(&q,value.lchild);
		}
	}
	printf("\n");
return;}

3.代码检测:

void textPreOrderByLoop(){
	printf("\n*************%s********************\n",__FUNCTION__);
	TreeNode* A = CreatTreeNode('a');
	TreeNode* B = CreatTreeNode('b');
	TreeNode* C = CreatTreeNode('c');
	TreeNode* D = CreatTreeNode('d');
	A->lchild = B;
	A->rchild = C;
	B->lchild = D;
	PreOrderByLoop(A);
}

结果显示:


二、中序遍历(非递归)

1.编程思路

        先进行判断根节点是否为空,为空直接返回,不为空则入栈并进行以下判断:取栈顶元素,对其左子树进行判断,如果其左子树不为空,将其左子树入栈并进行循环判断,知道其左子树为空,对该栈顶元素进行访问并出栈(访问包括打印,与对其右子树的判断,若其有子树不为空,将其入栈再继续,否则直接继续进行取栈顶元素操作,进行循环)。

思维图如下所示:


2.代码实现

//非递归的中许遍历二叉树
void InOrderByLoop(TreeNode* root){
	if(root == NULL){
		//空树
		return;
	}
	//入栈
	SeqStack q;
	SeqStackInit(&q);
	SeqStackPush(&q,root);
	TreeNode* cur = root->lchild;
	while(1){
		while(cur != NULL){
			SeqStackPush(&q,cur);
			cur = cur->lchild;
		}
		TreeNode value;
		if(GetStackTop(&q,&value)){
			printf("%c ",value.data);
			cur =value.rchild;
			SeqStackPop(&q);
		}else{
			printf("\n");
			return;
		}
	}
	return;
}

3.代码检测

void textInOrderByLoop(){
	printf("\n*************%s********************\n",__FUNCTION__);
	TreeNode* A = CreatTreeNode('a');
	TreeNode* B = CreatTreeNode('b');
	TreeNode* C = CreatTreeNode('c');
	TreeNode* D = CreatTreeNode('d');
	A->lchild = B;
	A->rchild = C;
	B->lchild = D;
	InOrderByLoop(A);
}

结果显示:


三、后序遍历(非递归)

1.编程思路

         先进行判断根节点是否为空,为空直接返回,不为空则入栈并进行以下判断:取栈顶元素,对其左子树进行判断,如果其左子树不为空,将其左子树入栈并进行循环判断,知道其左子树为空,对该栈顶元素进行访问并出栈(对其右子树的判断,若其有子树不为空,(此时将其右孩子与保存值进行比较,相等则打印、出栈,否则将其右孩子入栈再继续进行右孩子的左子树判断循环体,)为空则进行打印、出栈并保存,继续进行取栈顶元素操作,进行循环,直至栈为空。

思维图如下所示:


2.代码实现

//非递归的后序遍历二叉树
void PostOrderByLoop(TreeNode* root){
	if(root==NULL){
		//空树
		return;
	}
	//入栈
	SeqStack q;
	SeqStackInit(&q);
	SeqStackPush(&q,root);
	TreeNode* cur = root->lchild;
	while(1){
		while(cur != NULL){
			SeqStackPush(&q,cur);
			cur = cur->lchild;
		}
		TreeNode value;
		TreeNode pre;
		if(GetStackTop(&q,&value)){
			while(value.rchild ==NULL||(value.rchild)->data == pre.data){
				printf("%c ",value.data);
				pre = value;
				SeqStackPop(&q);
				if(GetStackTop(&q,&value)==0){
					printf("\n");
					return;
				}
			}
			cur = value.rchild;
		}else{
			printf("\n");
			return;
		}
	}
}

3.代码检测

void textPostOrderByLoop(){
	printf("\n*************%s********************\n",__FUNCTION__);
	TreeNode* A = CreatTreeNode('a');
	TreeNode* B = CreatTreeNode('b');
	TreeNode* C = CreatTreeNode('c');
	TreeNode* D = CreatTreeNode('d');
	A->lchild = B;
	A->rchild = C;
	B->lchild = D;
	PostOrderByLoop(A);
}

结果显示:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值