首页 > 其他分享 >后序遍历非递归(作业

后序遍历非递归(作业

时间:2023-11-03 19:35:49浏览次数:28  
标签:结点 遍历 递归 后序 bitree top visit NULL data

#define _CRT_SECURE_NO_WARNINGS
#define Max 64
#include<stdio.h>
#include<stdlib.h>


//二叉树的定义
typedef struct node
{
	char data;
	int visit;
	struct node* lchild;
	struct node* rchild;
}bitree;


//栈的定义
typedef struct
{
	bitree* data[Max];
	int top;
}seqstack;


//创建二叉树
bitree* CREATREE()
{
	bitree* Q[50];
	char ch;
	int front, rear;
	bitree* root, * s;
	root = NULL;//置空二叉树
	front = 1; rear = 0;
	ch = getchar();
	while (ch != '#')//#是结束字符
	{
		s = NULL;
		if (ch != '@')//@表示虚结点,不是虚结点建立新结点
		{
			s = (bitree*)malloc(sizeof(bitree));
			s->data = ch;
			s->lchild = NULL;
			s->rchild = NULL;
		}
		rear++;
		Q[rear] = s;//虚结点指针NULL或新结点地址入队
		if (rear == 1)
		{
			root = s;//输入的第一个结点为根结点
			s->visit = 0;
		}
		else
		{
			if (s && Q[front])//孩子和双亲都不是虚结点
			{
				if (rear % 2 == 0)
				{
					Q[front]->lchild = s;//rear为偶数,新结点是左孩子
					s->visit = 0;
				}
				else
				{
					Q[front]->rchild = s;//奇数是新结点是右孩子
					s->visit = 0;
				}
			}
			if (rear % 2 == 1)
				front++;//两个孩子均已处理完毕,出队列
		}
		ch = getchar();//输入下一个字符
	}
	return root;
}


//后序遍历非递归算法
void POSTORDER2(bitree* t)
{
	seqstack* s;
	s = (seqstack*)malloc(sizeof(seqstack));
	s->top = 0;
	s->data[s->top] = t;
	while (s->top != -1)
	{
		if (s->data[s->top]->lchild != NULL && s->data[s->top]->lchild->visit == 0)
		{
			s->data[s->top + 1] = s->data[s->top]->lchild;
			s->top++;
		}
		else if (s->data[s->top]->rchild != NULL && s->data[s->top]->rchild->visit == 0)
		{
			s->data[s->top + 1] = s->data[s->top]->rchild;
			s->top++;
		}
		else if (s->data[s->top]->visit == 0)
		{
			printf("%c ", s->data[s->top]->data);
			s->data[s->top]->visit = 1;
			s->top--;
		}
	}
}


//打印祖先
void Printfather(bitree* t,char x)
{
	seqstack* s;
	s = (seqstack*)malloc(sizeof(seqstack));
	s->top = 0;
	s->data[s->top] = t;
	while (s->top != -1)
	{
		if (s->data[s->top]->data == x)
		{
			//打印栈
			int tem = 0;
			tem = s->top;
			while (tem != 0)
			{
				printf("%c ", s->data[tem-1]->data);
				tem--;
			}
		}
		if (s->data[s->top]->lchild != NULL && s->data[s->top]->lchild->visit == 0)
		{
			s->data[s->top + 1] = s->data[s->top]->lchild;
			s->top++;
		}
		else if (s->data[s->top]->rchild != NULL && s->data[s->top]->rchild->visit == 0)
		{
			s->data[s->top + 1] = s->data[s->top]->rchild;
			s->top++;
		}
		else if (s->data[s->top]->visit == 0)
		{
			//printf("%c ", s->data[s->top]->data);
			s->data[s->top]->visit = 1;
			s->top--;
		}
	}
}


int main()
{
	bitree* t = CREATREE();
	Printfather(t, 'D');
}

标签:结点,遍历,递归,后序,bitree,top,visit,NULL,data
From: https://blog.51cto.com/u_15736615/8173702

相关文章

  • 掌握JavaScript中数组遍历的7种方法
    作为JavaScript开发人员,熟悉数组的遍历和操作是非常重要的。数组遍历是处理和操作数组元素的基本需求之一。本文将介绍JavaScript中的10种常见数组遍历方法,帮助你成为数组操作的达人。数组的遍历for循环forEach方法for...of循环map方法reduce方法for...in循环filter方法for循环or循......
  • fibnacci数列递归实现
    fibnacci数列递归实现1.网上查询资料说明什么是fibnacci数列?Fibonacci数列是一个整数序列,由意大利数学家LeonardoFibonacci在《计算之书》中提出,序列中的数字是前两个数字的和。序列的前几个数字是:0,1,1,2,3,5,8,13,21,34,...。这个序列以0和1开始,之后的每个数字都......
  • 查询算法——顺序查找(优化),二分查找(递归)
    顺序查找顺序查找又称为线性查找,是一种最简单的查找方法。适用于线性表的顺序存储结构和链式存储结构,从第一个元素开始逐个与需要查找的元素x进行比较,当比较到元素值相同时,返回元素m的下标,如果比较到最后都没有找到,则返回-1;时间复杂度为O(n)点击查看代码publicstaticvoidm......
  • fibnacci数列递归/迭代实现
    什么是fibnacci数列?斐波那契数列(Fibonaccisequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(LeonardoFibonacci)以兔子繁殖为例子而引入,故又称“兔子数列”,其数值为:1、1、2、3、5、8、13、21、34……在数学上,这一数列以如下递推的方法定义:F(0)=1,F(1)=1,F(n)=F(n-1)+F(n-......
  • 递归函数实现省市区多级联动搜索帮助
    1、需求背景当程序中有互为层级的字段,需要使用搜索帮助时,可以通过多次调用搜索帮助来实现。比如在程序中需要填写省市区三级地址2、实现方式2.1、平铺直叙程序的搜索帮助,通常使用F4IF_INT_TABLE_VALUE_REQUEST来实现。多级的搜索帮助,可以简单的通过多次调用F4函数来实现。点......
  • C# treeview 如何遍历MenuStrip的菜单
    需求分析: 数据菜单有四级菜单,需要在程序界面登录的时候遍历菜单的内容开发环境:VSC#winform步骤1:新建一个窗体步骤2:新建一个MenuStrip,并且定义内部的名称步骤3:新建一个Treeview步骤4:开始编程,定义一个参数函数: GetMenu(TreeView V,MenuStrip S)步骤5:编写参数函数的代码......
  • C# 控件基础1 | 从多态角度理解、遍历菜单栏控件ToolSplit
    一、文章背景1.多态简单描述多态是同一个行为,具有不同的结果。比如都是“叫”,而狗和猫的叫法,声波等形态不一样。多态离不开重载,利用重载某个方法实现其在派生类自己的功能。在C#中,每个类型都是多态的,因为包括用户定义类型在内的所有类型都继承自Object。2.多态在开发中的应......
  • import.meta.globEager('./src/components/**/*.vue'); 遍历文件
    main.jsconstimportAll=(modules)=>{Object.keys(modules).forEach((key)=>{constcomponent=key.replace('/src/','@/').replace('.vue','');constcomponentName=key.split('/').slice(......
  • 关于二叉树中三种深度遍历方式的理解
    今日刷题,538.把二叉搜索树转换为累加树。明确知道利用二叉搜索树中序遍历的情况下是有序数组这一个特点,进行“逆中序”来累加。但是在递归时却还是有些没有搞清楚一些细节,终究还是没有掌握。问题主要还是在于递归返回值的处理上:在中序遍历的情况下,似乎对于左右两个节点的遍历,不......
  • SqlServer的With递归查询子父级
    工作中有一个需求,要判断客户是否有后续订单,就是查后面的订单是否此客户ID下单,而且要把此客户的所有关联的客户也都判断上这有点头痛,因为关联客户是一个嵌套型父子级的结构,客户A关联客户B,客户B关联客户C,客户C关联客户D,无论取客户A、B、C、D任一一个去查,都要把整个关联关系的客户A......