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

数据结构项目——二叉树实现案例分析:写出下面二叉树的先、中、后序遍历输出的结果:注:先自己推算,然后用程序验算。先序遍历的结果: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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • hostapd和dhcpd

    hostapd和dhcpdhostapd.conf#####hostapdconfigurationfile##############################################interface=wlan0ctrl_interface=/var/run/hostapdssid=rtwapchannel=6wpa=2wpa_passphrase=87654321#bridge=br0

    2022年5月21日
    47
  • 哈佛校训20条人生箴言「建议收藏」

    哈佛校训20条人生箴言「建议收藏」第一章从今日启程校训1:此刻打盹,你将做梦;而此刻学习,你将圆梦校训2:我荒废的今日,正是昨日殒身之人祈求的明日校训3:勿将今日之事拖到明日第二章学习态度决定事业高度校训4:学习时的苦痛

    2022年8月5日
    11
  • tar打包的时候忽略一些目录[通俗易懂]

    tar打包的时候忽略一些目录[通俗易懂]tar打包的时候忽略版本管理文件目录、日志文件目录、storage/app目录tar-zcvfweb.tar.gzweb–exclude-vcs–exclude=storage/logs–exclude=storage/app

    2022年5月6日
    218
  • centos7 mysql重置密码_mysql查看root密码

    centos7 mysql重置密码_mysql查看root密码按照这里的步骤进行但是在进行到step5的时候执行这个命令会出现如下错误Fatalerror:Pleaseread“Security”sectionofthemanualtofindouthowtorunmysqldasroot!mysql不会默认以root用户启动mysqld,所以要显式地指明启动用户是root。使用如下命令可以解决mysqld–user=root–init-file=你编写的init文件路径&加&的目的是后台

    2022年10月15日
    3
  • 关于左右连接「建议收藏」

    关于左右连接「建议收藏」首先来看一下两张主要的表:persons表orders表现在我们希望列出所有的人,以及他们的定购。SELECTpersons.last_name,persons.first_name,orders.order_noFROMpersonsLEFTJOINordersONpersons.pid=orders.pidORDER

    2026年1月21日
    6
  • 毕业四年

    好久不见,一年一度的“毕业N年”系列,2019,毕业四年了。工作去年9月份从前公司离职了,加入阿里,很快,再两个月就入职一年了。几条工作上的感受和建议,希望对你有所帮助。1、谨慎面试,大厂永远在招人以阿里为例,你的所有面试记录都是留存的,包括每个面试官的评价以及结果,如果准备不充分的情况下频繁面试,留下的记录会影响之后面试官对你的印象。如果对某个岗位感兴趣,最好联系对应岗位部门的同学,简历…

    2022年3月11日
    46

发表回复

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

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