数据结构--非递归遍历二叉树(利用辅助栈)

本文介绍了一种使用辅助栈实现的二叉树非递归前序遍历方法,并通过C语言代码详细展示了整个过程。此外,还提供了递归版本的先序遍历作为对比。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include "StdAfx.h"  
#include <stdio.h>  
#include <stdlib.h>  
/*非递归方法前序遍历二叉树,利用辅助栈(指针数组实现)。由于对指针不是很熟悉,代码较为混乱,基本上实现遍历的功能。
主要练习对结构体指针与链表的使用。*/  
typedef struct tree{  
       int key;  
       struct tree *left;  
       struct tree *right;  
   
}*BiTree,Node;  
BiTree *temp[100]={NULL};//存放当前根节点的指针
int flag=-1;//保存当前栈顶位置
//循环创建二叉树  
void CreateBiTree(BiTree &T)/*DEVC++无法编译此句话,需要从vs中运行*/  
{    
     int word;  
     scanf("%d",&word);//输入的节点值  
     if(word==-1)//-1表示该节点下面没有左右孩子  
     {  
            T=NULL;  
     }  
     else  
     {    //生成当前的根节点 
			Node *p=(Node *) malloc (sizeof(Node));//开辟新的节点    
			T=p;
            T->key=word;  
            CreateBiTree(T->left);//递归建立左子树  
            CreateBiTree(T->right); //递归建立右子树   
     }  
}  
int isEmpty()//判断栈是否为空 
{
	if(flag==-1)
		return 1;
	return 0;
}
void push(BiTree &T)//节点入栈
{
	flag++;
	BiTree *p=&T;
	temp[flag]=p;
}
BiTree *pop()//节点出栈
{
	BiTree t=*temp[flag];
	flag--;
	return &t;
}
void NonRecOrder(BiTree &T)//非递归前序遍历
{
	BiTree t;//临时节点
	push(T);//当前根节点入栈
	while(!isEmpty())//栈不为空则循环继续
	{
		t=*pop();//取出当前栈顶节点
		printf("%d ",t->key);//获取节点值
		if(t->left&&!(t->right))//当只有左孩子时,将左孩子入栈,并向下继续搜索
		{
			push(t->left);
			t=t->left;
		}
		else if(t->right&&!(t->left))//当只有右孩子时,将右孩子入栈,并继续向下搜索
		{
			push(t->right);
		 t=t->right;
		}
		else if(t->right&&t->left)//两个孩子都有的情况先将右孩子入栈,再将左孩子入栈,并继续向左孩子搜索
		{
			push(t->right);
			push(t->left);
			t->left;
		}
	}
}
void PreOrder(BiTree &T)  //递归先序遍历以T为根的二叉树  
{  
     if(T)//T不为空或者根时   
     {  
            printf("%d ",T->key);//打印当前节点  
            PreOrder(T->left);  
            PreOrder(T->right);         
     }  
}  

int main(int argc, char *argv[])  
{  
  BiTree T;  
  printf("请依次输入1,2,-1,3,4,-1,-1,-1,5,-1,6,-1,-1\n其中-1代表前面的节点没有左孩子或者右孩子\n");  
  CreateBiTree(T);  
  printf("递归法先序遍历的顺序是\n");  
  PreOrder(T);  
  printf("\n非递归先序遍历的顺序是\n");  
  NonRecOrder(T);
  system("PAUSE");    
  return 0;  
}  

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值