数据结构与算法之二叉树的建立

2023-11-11

一、 已知二叉树的先序和中序数列,创建二叉树

1)算法思想

在这里插入图片描述

2)代码实现

#include<stdio.h>
#include <malloc.h>
#include<stdlib.h>
#include<string.h>

typedef char Elemtype;
typedef struct BtNode
{
	struct BtNode* leftchild;
	struct BtNode* rightchild;
	Elemtype data;
}BtNode,* BinaryTree;


//中序遍历
void InOder(BtNode* ptr)
{
	if (ptr != nullptr)
	{
		InOder(ptr->leftchild);
		printf("%c ", ptr->data);
		InOder(ptr->rightchild);
	}
}

//先序遍历
void PreOder(BtNode* ptr)
{
	if (ptr != nullptr)
	{
		printf("%c ", ptr->data);
		PreOder(ptr->leftchild);
		PreOder(ptr->rightchild);
	}
}

//后序遍历
void PastOder(BtNode* ptr)
{
	if (ptr != nullptr)
	{
		PastOder(ptr->leftchild);
		PastOder(ptr->rightchild);
		printf("%c ", ptr->data);
	}
}

//初始化节点
BtNode* Buynode()
{
	BtNode* s = (BtNode*)malloc(sizeof(BtNode));
	if (nullptr == s) exit(1);
	memset(s, 0, sizeof(BtNode));
	return s;
}

int FindPos(const char* istr, int n, char ch)
{
	int pos = -1;
	for (int i = 0; i < n; i++)
	{
		if (istr[i] == ch)
		{
			pos = i;
			break;
		}
	}
	return pos;
}

BtNode* CreatBTreePI(const char* pstr, const char* istr,int n)
{
	BtNode* s = nullptr;
	if (n > 0)
	{
		s = Buynode();
		s->data = pstr[0];
		int pos = FindPos(istr, n, pstr[0]);
		if (pos == -1)exit(1);
		s->leftchild = CreatBTreePI(pstr+1,istr,pos);
		s->rightchild = CreatBTreePI(pstr+pos+1,istr+pos+1,n-pos-1);
	}
	return s;
}

BtNode* CreatBinaryTreePI(const char* pstr, const char* istr)
{
	int n = strlen(pstr);
	int m = strlen(istr);
	if (nullptr == pstr || nullptr == istr || n < 1 || m < 1 || n != m)return nullptr;
	else return CreatBTreePI(pstr, istr, n);  //这里n代表的规模


}

int main()
{
	const char* pstr = "ABCDEFGH"; //先序数列
	const char* istr = "CBEDFAGH"; //中序数列
	BinaryTree root = CreatBinaryTreePI(pstr, istr); //通过先序数列和中序数列创建二叉树
	PreOder(root);
	printf("\n");
	InOder(root);
	printf("\n");
	PastOder(root);
	printf("\n");
}

二、已知二叉树的先序和后序数列,创建二叉树

1)算法思想

在这里插入图片描述

2)代码实现

核心代码

int FindPos(const char* istr, int n, char ch)
{
	int pos = -1;
	for (int i = 0; i < n; i++)
	{
		if (istr[i] == ch)
		{
			pos = i;
			break;
		}
	}
	return pos;
}

BtNode* CreatBTreeIL(const char* istr, const char* lstr, int n)
{
	BtNode* s = nullptr;
	if (n > 0)
	{
		s = Buynode();
		s->data = lstr[n-1];
		int pos = FindPos(istr, n, lstr[n-1]);
		if (pos == -1)exit(1);
		s->leftchild = CreatBTreeIL(istr,lstr,pos);
		s->rightchild = CreatBTreeIL(istr+pos+1,lstr+pos,n-pos-1);
	}
	return s;
}

BtNode* CreatBinaryTreeIL(const char* istr, const char* lstr)
{
	int n = strlen(istr);
	int m = strlen(lstr);
	if (nullptr == istr || nullptr == lstr || n < 1 || m < 1 || n != m)return nullptr;
	else return CreatBTreeIL(istr, lstr, n);  //这里n代表的规模

}

三、二叉树的顺序存放(打印先、中、后序遍历)

#include<stdio.h>
#include <malloc.h>
#include<stdlib.h>
#include<string.h>

void InOrder_Ar(const int* arr, int i,int n)
{ 
	if (i<n&&arr[i]!=-1)
	{
		InOrder_Ar(arr, i*2+1, n);
		printf("%d ", arr[i]);
		InOrder_Ar(arr, i * 2 + 2, n);
	}
}

void PreOrder_Ar(const int* arr, int i, int n)
{
	if (i < n && arr[i] != -1)
	{
		printf("%d ", arr[i]);
		PreOrder_Ar(arr, i * 2 + 1, n);
		PreOrder_Ar(arr, i * 2 + 2, n);
	}
}

void PastOrder_Ar(const int* arr, int i, int n)
{
	if (i < n && arr[i] != -1)
	{
		PastOrder_Ar(arr, i * 2 + 1, n);
		PastOrder_Ar(arr, i * 2 + 2, n);
		printf("%d ", arr[i]);
	}
}

int main()
{
	int arr[] = { 31,23,12,66,-1,5,17,70,62,-1,-1,-1,88,-1,55 };
	int n = sizeof(arr) / sizeof(arr[0]);
	InOrder_Ar(arr,0, n);
	printf("\n");
	PastOrder_Ar(arr, 0, n);
	printf("\n");
	PreOrder_Ar(arr, 0, n);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构与算法之二叉树的建立 的相关文章

随机推荐

  • FastDFS 介绍及安装部署

    FastDFS 介绍及安装部署 FastDFS 组成 Tracker Server Storage Server FastDFS上传机制 FastDFS使用场景 FastDFS架构 实验环境 部署 FastDFS 安装依赖 安装服务端 配置
  • 摄像头参数 靶面尺寸 像素阵列 像元尺寸 光学结构

    靶面尺寸 Optical Format 图像传感器的尺寸越大 则成像系统的尺寸越大 捕获的光子越多 感光性能越好 信噪比越低 像素阵列 Pixel Array 对景物中明暗细节的分辨能力 像元尺寸 Pixel Size 像元尺寸是指芯片像元
  • 图片下载功能

    GetMapping flag public void getFiles PathVariable String flag HttpServletResponse response OutputStream os 新建一个输出流对象 Str
  • FZ15S五轴加工中心的自动换刀装置设计(论文+CAD图纸+SW三维图+开题报告+任务书+外文翻译)

    摘要 随着我国国民经济迅速发展和国防建设的需要 对高档的数控机床提出了急迫的大量需求 机床是一个国家制造业水平的象征 而代表机床制造业最高境界的是五轴联动数控机床系统 从某种意义上说 反映了一个国家的工业发展水平状况 长期以来 以美国为首的
  • servlet相关知识整理

    servlet相关知识整理 一 sevlet规范 1 servelet规范中 指定 动态资源文件 开发步骤 2 在servelet规范中 指定http服务器调用动态资源文件规则 3 在servelet规范中 指定http服务器管理动态资源文
  • 微信小程序wxml页面中,背景图片直接引用不显示,其他解决方案

    微信小程序wxml页面中 使用background url 引用图片的相对路径 但是不显示应该咋办 var src images index top bg png let src2 wx getFileSystemManager readF
  • crossdomain.xml在weblogic上的部署

    摘要 Flex API的程序访问ArcGIS Server时 经常遇到安全沙箱的问题 crossdomain xml配置文件可以解决这个问题 在tomcat服务器只需要把这个文件放到webapps根目录下 WebLogic的配置要稍微麻烦一
  • pandas 根据某一列的值修改某一列的值

    在做数据分析时 需要根据某一列的值修改另外一列的值 此时就需要使用pd loc 函数 例子 import pandas as pd x2 pd read csv submit csv x2 假如 我要修改id 800000的isDefaul
  • 光条中心提取方法总结(二)

    传统算法见之前的文章 光条中心提取方法总结 一 视觉菜鸟Leonardo的博客 CSDN博客e 二 深度学习方法 利用深度学习来进行光条中心提取是这几年刚兴起的方法 目前可供参考的论文屈指可数 方法从两个途径切入 1 利用深度学习进行光条图
  • 研一Python基础课程第二周课后习题分享(含代码)

    一 问题描述 共计18道 1 问题1 你买了n个苹果 但是很不幸里面混进了一条虫子 如果虫子每x小时吃完一只苹果 然后开始吃下一个 经过y小时后 你还有几个完整的苹果 分别输入n x y三个整型数值 输出结果 2 问题2 分别输入两个时间
  • javascript 实现Base64加密

    想必大家对base64并不陌生吧 在本文将为大家介绍下Js中的base64加密解密过程 感兴趣的朋友不要错过 html view plain copy
  • 关于存储那些事1-----基础篇

    目录 一 SSD 1 简介 1 1 分类 1 1 1 易失性存储器 1 1 2 非易失性存储器 2 SSD接口 2 1 SATA接口 2 2 SATA Express接口 2 3 SAS接口 2 4 U 2接口 2 5 mSATA接口 2
  • 【解决方案】LaTeX插入svg图片

    LaTeX插入svg图片的解决方案 今天在写论文时 想在论文里插入svg图片 遇到了问题 百度了一下方法 发现LaTeX不支持插入svg图片 在捣鼓了一下之后 发现基本的方法不是失效就是比较麻烦 本文简单总结了两个解决方案 发现都不太行 研
  • 系统及服务器巡检流程图,巡检日常工作流程图

    巡检日常工作流程图 由会员分享 可在线阅读 更多相关 巡检日常工作流程图 1页珍藏版 请在人人文库网上搜索 1 质质检检日日常常巡巡检检流流程程图图 查查看看生生产产交交接接半半成成品品或或成成品品 初初步步确确定定生生产产零零件件 准准备
  • Win10下安装mujuco

    1 背景 安装mujuco之前玩的环境都是些简单的 易处理的环境 就是下面这种 第一张图是移动下面的方块保持杆子立起来环境 第二张图是小车爬山环境 第三张图是给杆子施加力使得杆子保持立起来环境 从图也可以看出 是比较简单的环境 而mujuc
  • 批量文本文件内容替换之Linux sed命令

    文章目录 sed命令简介 需求 sed实现批量替换 sed命令简介 Linux sed命令可以使用shell脚本进行文件的批量处理 如批量替换 修改等等 尤其是在需要对大量文本文件进行批量操作时 使用sed命令会起到事半功倍的效果 关于详细
  • 其他-08-idea配置查询字节码

    1 字节码查询 查看一下idea是否安装了 一般都安装了 编译一下 生成target 点击View下面的Show ByteCode即可 其实你看到的字节码是java加工多的 可以看下这个类 原生都是数字 以 helloWql方法字节码解释
  • 为何程序员完成最后20%的工作需要的时间跟之前的80%一样多?

    听过行百里者半九十吧 这句话在程序员的工作中同样适用 到底是为何呢 Matija用一个精巧的比喻揭示了个中道理 其实这就好比在高峰期从郊外开车回市中心 前 80 的路程很顺 高速嘛 可能两小时就走完了 但是到了城里 就走不动了 红绿灯 人行
  • MATLAB点云处理函数整理

    pcbin 空间bin点云点 bins pcbin ptCloud numBins bins pcbin ptCloud numBins spatialLimits bins binLocations pcbin pcdenoise 去噪
  • 数据结构与算法之二叉树的建立

    文章目录 一 已知二叉树的先序和中序数列 创建二叉树 1 算法思想 2 代码实现 二 已知二叉树的先序和后序数列 创建二叉树 1 算法思想 2 代码实现 三 二叉树的顺序存放 打印先 中 后序遍历 一 已知二叉树的先序和中序数列 创建二叉树