数据结构项目——二叉树实现

数据结构项目——二叉树实现案例分析:写出下面二叉树的先、中、后序遍历输出的结果:注:先自己推算,然后用程序验算。先序遍历的结果:A F H D C B J G E I K中序遍历的结果:D H C F J B G A I E K后序遍历的结果:D C H J G B F I K E A代码如下:#include “pch.h”#include &…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

案例分析:

写出下面二叉树的先、中、后序遍历输出的结果:
注:先自己推算,然后用程序验算。

在这里插入图片描述
先序遍历的结果:A F H D C B J G E I K
中序遍历的结果:D H C F J B G A I E K
后序遍历的结果:D C H J G B F I K E A

代码如下:

#include "pch.h"
#include <iostream>
using namespace std;

int top = -1;
typedef struct Bitnode
{ 
   
	char data;
	Bitnode *lchild, *rchild;
}Bitnode,*bittree;

//创建一个二叉树
void Createbittree(bittree *t)
{ 
   
	*t =(Bitnode *) malloc(sizeof(Bitnode));
	(*t)->data = 'A';
	(*t)->lchild= (Bitnode *)malloc(sizeof(Bitnode));
	(*t)->rchild =(Bitnode *)malloc(sizeof(Bitnode));
	(*t)->lchild->data = 'F';
	(*t)->rchild->data = 'E';
	(*t)->lchild->lchild = (Bitnode *)malloc(sizeof(Bitnode));
	(*t)->lchild->rchild = (Bitnode *)malloc(sizeof(Bitnode));
	(*t)->rchild->lchild = (Bitnode *)malloc(sizeof(Bitnode));
	(*t)->rchild->rchild = (Bitnode *)malloc(sizeof(Bitnode));
	(*t)->lchild->lchild->data = 'H';
	(*t)->lchild->rchild->data = 'B';
	(*t)->rchild->lchild->data = 'I';
	(*t)->rchild->rchild->data = 'K';
	(*t)->rchild->lchild->lchild= NULL;
	(*t)->rchild->lchild->rchild= NULL;
	(*t)->rchild->rchild->lchild = NULL;
	(*t)->rchild->rchild->rchild = NULL;
	(*t)->lchild->lchild->lchild = (Bitnode *)malloc(sizeof(Bitnode));
	(*t)->lchild->lchild->lchild->lchild = NULL;
	(*t)->lchild->lchild->lchild->rchild = NULL;
	(*t)->lchild->lchild->rchild = (Bitnode *)malloc(sizeof(Bitnode));
	(*t)->lchild->lchild->rchild->lchild = NULL;
	(*t)->lchild->lchild->rchild->rchild = NULL;
	(*t)->lchild->rchild->lchild = (Bitnode *)malloc(sizeof(Bitnode));
	(*t)->lchild->rchild->lchild->lchild = NULL;
	(*t)->lchild->rchild->lchild->rchild = NULL;
	(*t)->lchild->rchild->rchild = (Bitnode *)malloc(sizeof(Bitnode));
	(*t)->lchild->rchild->rchild->lchild = NULL;
	(*t)->lchild->rchild->rchild->rchild = NULL;
	(*t)->lchild->lchild->lchild->data = 'D';
	(*t)->lchild->lchild->rchild->data = 'C';
	(*t)->lchild->rchild->lchild->data = 'J';
	(*t)->lchild->rchild->rchild->data = 'G';
}
//先序遍历入栈
void Push(Bitnode **a,Bitnode *elem)
{ 
   
	a[++top] = elem;
}
//先序遍历出栈
void Pop()
{ 
   
	if (top==-1)
	{ 
   
		return;
	}
	top--;
}
//获取栈顶元素
Bitnode *Get_top(Bitnode**a)
{ 
   
	return a[top];
}
//输出节点数据
void Printelem(Bitnode *elem)
{ 
   
	cout << elem->data << " ";
}
//实现先序遍历算法
void preorder(Bitnode*tree)
{ 
   
	Bitnode *a[30];
	Bitnode *p;
	Push(a, tree);
	while (top!=-1)
	{ 
   
		p = Get_top(a);
		Pop();
		while (p)
		 { 
   
			Printelem(p);
			if (p->rchild)
			{ 
   
				Push(a,p->rchild);
			}
			p = p->lchild;
		}
	}
}
//中序遍历二叉树
void inorder(bittree tree)
{ 
   
	Bitnode *a[30];	//定义一个顺序栈
	Bitnode *p;		//临时指针
	Push(a, tree);	//根节点入栈
	while (top != -1)	//top!=-1来判定栈是否为空
	{ 
   
		while ((p=Get_top(a))&&p)//获取栈顶元素不为空
		{ 
   
			//左子树节点入栈,如果没有,null入栈
			Push(a, p->lchild);
		}
		Pop();//跳出循环,栈顶元素是空,
		if (top!=-1)
		{ 
   
			p = Get_top(a);//获取栈顶元素
			Pop();
			Printelem(p);
			Push(a,p->rchild);//右子树节点入栈
		}
	}
}



//二叉树后序遍历(非递归法)
struct Snode
{ 
   
	bittree p;
	int tag;
};
//后序遍历的入栈函数
void PostPush(Snode*a, Snode sdata)
{ 
   
	a[++top] = sdata;
}
//后序遍历
void PostOrder(bittree tree)
{ 
   
	Snode a[20];
	Bitnode*p;		//节点指针
	int tag;
	Snode sdata;
	p = tree;
	while (p||top!=-1)//用的或,这两种都行
	{ 
   
		while (p)
		{ 
   
			sdata.p = p;
			sdata.tag = 0;//遍历左子树,设置标记位为0
			PostPush(a, sdata);//入栈
			p = p->lchild;//以该节点为根节点,遍历左子树
		}
		sdata=a[top];
		Pop();
		p = sdata.p;
		tag = sdata.tag;

		if (tag==0)//条件为真,左子树遍历完成,该节点需要遍历右子树
		{ 
   
			sdata.p = p;
			sdata.tag = 1;
			PostPush(a, sdata);//更改节点标志位,重新入栈
			p = p->rchild;//将该节点的右子树设置为根节点,重新循环

		}
		else
		{ 
   
			Printelem(p);
			p = NULL;
		}
	}
}
int main()
{ 
   
	bittree tree;
	Createbittree(&tree);
	cout << "先序遍历的结果为:";
	preorder(tree);
	cout << endl;
	cout << "中序遍历的结果为:";
	inorder(tree);
	cout << endl;
	cout << "后序遍历的结果为:";
	PostOrder(tree);
	cout << endl;
	return 0;
}

结果为:
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/170980.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • PHP小程序开发_微信小程序后端语言

    PHP小程序开发_微信小程序后端语言想要快速地开发一个小程序,很多环节都需要注意,微信小程序php后端的开发估计很多人都还很陌生,但是这也是至关重要的,一起来看看开发实例详解吧。1.小程序相对于之前的WEB+PHP建站来说,个人理解为只是将web放到了微信端,用小程序固定的格式前前端进行布局、事件触发和数据的输送和读取,服务器端可以用任何后端语言写,但是所有的数据都要以JSON的形式返回给小程序。2.昨天写了登录注册、忘记密码功能,…

    2022年9月17日
    2
  • 怎么查看线程的状态及interrupt优雅的关闭线程和interrupt()、interrupted()、isInterrupted()的作用以及区别在哪?

    怎么查看线程的状态及interrupt优雅的关闭线程和interrupt()、interrupted()、isInterrupted()的作用以及区别在哪?示例:查看状态:刚才我们讲过,一个线程里面任务正常执行完毕,状态就是TERMINATED,就是终止状态。但是,如果我线程里面的任务一直没有执行完成,我想去终止这个线程,或者我给点信息给到线程里,告诉线程我想终止结束呢!所以我可以强制去关闭线程:线程提供一个stop方法,该方法不建议使用,已经过时了!!因为stop是强行关闭线程,线程里面的任务都不在执行,不管线程的任务是否执行成功与否,就算执行到一半也会强制关闭!导致很多不可控制的结果,比如支付付一半等等!!所以我们要需要去优雅的关闭。什么叫做优雅关

    2025年7月29日
    4
  • sqlserver日期转字符串 yyyymmddhhmmss_sql中将date转换为字符串

    sqlserver日期转字符串 yyyymmddhhmmss_sql中将date转换为字符串SELECT CONVERT( datetime, SUBSTRING(intotime,1,8)+”+SUBSTRING(intotime,9,2)+’:’+SUBSTRING(intotime,11,2) )FROM table

    2022年10月8日
    2
  • Android清理设备内存具体完整演示样例(一)

    Android清理设备内存具体完整演示样例(一)

    2021年12月14日
    51
  • 十大经典武侠小说[通俗易懂]

    孤枕侧畔,一灯如豆,看尽万千红尘旧事刀枪入梦,剑气漫天,重温多少江湖恩仇    一说起武侠小说,每个像我这么大的男性或是比我小一些的男性都会眉飞色舞的侃上半天,仿佛每个人都是此中高手,但是武侠小说浩如烟海,能称得上作家的也多如牛毛,故高手或是低手之分并不在于看得多少,而在于精的程度。我之所以谈起这些来就不由得总是有些洋洋自得,便是因为我觉得自己看武侠小说既精又多,称得上此中高手,所

    2022年4月17日
    125
  • 小区口的凉皮大叔,实力演绎如何低调地月入30000

    小区口的凉皮大叔,实力演绎如何低调地月入30000

    2022年3月12日
    67

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号