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

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


相关推荐

  • Windows10系统设置定时关机「建议收藏」

    Windows10系统设置定时关机「建议收藏」1.输入cmd运行命令提示符2.输入 shutdown–s–t3600   [注:3600为倒计时的秒数,此语句为系统在一小时后关机]/*shutdown命令的参数:shutdown-a 取消关机shutdown-s关机shutdown-f 强行关闭应用程序shutdown-m计算机名 控制远程计算机shutdown-i 显示“远程关机”图形用户界面,…

    2022年5月15日
    42
  • 破解不加微信看朋友圈「建议收藏」

    破解不加微信看朋友圈「建议收藏」有网友发邮件问,用空间万能查看器天涯,可以强制看非好友的朋友圈?今天小编就给大家说说微信朋友圈的一些事情。微信好友之间可以看到对方朋友圈每次发的一些动态记录,只要对方不设置让你看不到,就可以看到。不是微信好友想看对方朋友圈,也是可以理解的,毕竟微信朋友圈,和QQ空间设置了这个权限是需要权限才能进去的,有的网友有方法进别人设置了权限的QQ空间,那么微信的权限朋友圈其实和QQ权限空间原理是一样的。QQ空间和微信朋友圈其实是一样的意思,只是表现的形势不同,但是有的人喜欢上微信,有的人喜欢上QQ,不管你

    2022年4月29日
    2.7K
  • 分析如何用万能表测试MOS管好坏的小窍门

    分析如何用万能表测试MOS管好坏的小窍门   现在家电、照明、汽车电子等领域行业开关管均采用性能优异的MOS管取代过去的大功率晶体三极管,使整体的效率、可靠性、故障率均大幅的下降。       虽说是大幅降低,但也会出现损坏的情况,由于MOS管和大功率晶体三极管在结构、特性有着本质上的区别,在应用上驱动电路也比晶体三极管复杂,致使维修人员对电路、故障的分析倍感困难。怎么对MOS管进行检测呢?一起来了解下  MOS…

    2022年6月17日
    22
  • Ubuntu之cudnn安装

    Ubuntu之cudnn安装一、cudnn简介二、安装步骤

    2022年5月16日
    49
  • Heartbleed心脏出血漏洞原理分析

    Heartbleed心脏出血漏洞原理分析Heartbleed心脏出血漏洞原理分析Heartbleed心脏出血漏洞原理分析2017年01月14日18:14:25阅读数:27182017年01月14日18:14:25阅读数:271

    2022年7月1日
    26
  • 城际出行报告:后滴滴时代的千亿蓝海

    城际出行报告:后滴滴时代的千亿蓝海

    2021年9月15日
    144

发表回复

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

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