在C++编译器下可直接运行

#include <stdio.h>
#include <malloc.h> //算法思想:先读入根结点数据,并且创建根结点,在读入左子树数据并创建左子树
//之后再读入右子树数据并创建右子树,在根结点左右子树创建好之后,最终将根结点返回。 typedef char ElemType;
typedef struct BiTNode
{
ElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree; BiTNode *createBiTree()//该函数用来创建一棵树
{
BiTNode *T = NULL;
ElemType enter;
enter = getchar();//可能读入空格,这样就结束输入 if('@' != enter)
{
T = (BiTNode *)malloc(sizeof(BiTNode));
T->data = enter; T->lchild = createBiTree();//结构体用点,结构体指针用箭头***********
T->rchild = createBiTree();
}
return T;
} void preOrder(BiTree T)
{
if(T != NULL)
{
printf("%c ", T->data);
preOrder(T->lchild);
preOrder(T->rchild);
}
} void midOrder(BiTree T)
{
if(T != NULL)
{
midOrder(T->lchild); printf("%c ", T->data); midOrder(T->rchild);
}
} //給定二叉鏈表的先序遍歷和中序遍歷,構造一顆二叉鏈表表示一棵樹 BiTNode *createBiTree1(ElemType preOrderList[],int preStartIndex,int preEndIndex,
ElemType inOrderList[],int inStartIndex,int inEndIndex)
{
if(preStartIndex > preEndIndex)
{
return NULL;
}
BiTNode *t = (BiTNode *)malloc(sizeof(BiTNode));
t->data = preOrderList[preStartIndex];
int rootIndex;
for(rootIndex = inStartIndex;rootIndex <= inEndIndex;rootIndex++)//在中序序列中查找跟節點位置
{
if(t->data == inOrderList[rootIndex])
{
break;
}
}
int length = rootIndex - inStartIndex;
t->lchild = createBiTree1(preOrderList,preStartIndex + 1,preStartIndex + length,
inOrderList,inStartIndex,rootIndex - 1);
t->rchild = createBiTree1(preOrderList,preStartIndex + length + 1,preEndIndex,
inOrderList,rootIndex + 1,inEndIndex);
return t;
} //层次遍历
//输入层次遍历序列和中序序列创建一棵二叉树
//算法思想:先层次遍历确定(子树)根结点,再到中序序列中确定根位置,分出左右子树数列。
//然后确定层次遍历对左右子树序列,构建左右子树,重复上述步骤,构建整棵二叉树。 #define MAX_SIZE 100 BiTNode *createBiTree2(ElemType levelOrderList[],int levelStartIndex,int levelEndIndex,
ElemType inOrderList[],int inStartIndex,int inEndIndex)
{
if(levelStartIndex > levelEndIndex)
{
return NULL;
} BiTNode *t = (BiTNode *)malloc(sizeof(BiTNode));
t->data = levelOrderList[levelStartIndex];
int rootIndex;//在中序遍历序列中确定子树根结点位置
for(rootIndex = inStartIndex;rootIndex < inEndIndex;rootIndex++)
{
if(inOrderList[rootIndex] == t->data)
{
break;
}
}
ElemType lftLeverOrderList[MAX_SIZE];
int lftLeverLength = 0;
for(int j = levelStartIndex + 1;j <= levelEndIndex;j++)//找出左子树的层次遍历序列
{
for(int i = inStartIndex;i <= rootIndex - 1;i++)
{
if(inOrderList[i] == levelOrderList[j])
{
lftLeverOrderList[lftLeverLength++] = levelOrderList[j];
}
}
}
ElemType rgtLeverOrderList[MAX_SIZE];
int rgtLeverLength = 0;
for(int j = levelStartIndex + 1;j <= levelEndIndex;j++)//找出左子树的层次遍历序列
{
for(int i = rootIndex + 1;i <= inEndIndex;i++)
{
if(inOrderList[i] == levelOrderList[j])
{
rgtLeverOrderList[rgtLeverLength++] = levelOrderList[j];
}
}
}
t->lchild = createBiTree2(lftLeverOrderList,0,lftLeverLength - 1,
inOrderList,inStartIndex,rootIndex - 1);
t->rchild = createBiTree2(rgtLeverOrderList,0,rgtLeverLength - 1,
inOrderList,rootIndex + 1,inEndIndex);
return t;
} ////层次遍历
//void levelTravelBiTree(BiTree T)
//{
// queue q;
// initailQueue(q);
// enQueue
//} int main()
{
// BiTree T = createBiTree();
// preOrder(T);
// midOrder(T);
// char preOrderList[] = {'A','B','D','E','C','F','G'};
// int preOrderListLength = 7;
char leverOrderList[] = {'A','B','C','D','E','F','G'};
int leverOrderListLength = 7;
char inOrderList[] = {'D','B','E','A','F','C','G'};
int inOrderListLength = 7;
BiTree t = createBiTree2(leverOrderList,0,leverOrderListLength - 1,inOrderList,0,inOrderListLength - 1);
preOrder(t);
printf("\n");
midOrder(t);
return 0;
}

二叉树总结——BiTree的更多相关文章

  1. 二叉树根结点到任意结点的路径(C语言)

    有一棵二叉树,如下图所示: 其中 # 表示空结点. 先序遍历:A B D E G C F 问题:怎么得到从根结点到任意结点的路径呢? 示例:输入 G,怎么得到从结点 A 到结点 G 的路径呢? 很明显 ...

  2. Siki_Unity_3-13_编程内功修炼-算法

    Unity 3-13 编程内功修炼 -- 算法 任务1&2:课程介绍 主要算法: 分治法 堆排序 二叉树 动态规划 贪心算法 图 任务3:分治算法 -- Divide and Conquer ...

  3. 数据结构代码整理(线性表,栈,队列,串,二叉树,图的建立和遍历stl,最小生成树prim算法)。。持续更新中。。。

    //归并排序递归方法实现 #include <iostream> #include <cstdio> using namespace std; #define maxn 100 ...

  4. 二叉树的实现与一些基本操作(C++环境)

    #include<cstdio>#include<cstdlib>#include<iostream>#include<cstring>using na ...

  5. 二叉树[C实现]

    #include<stdio.h> #include<malloc.h> #include<iostream> //定义节点 typedef struct BiNo ...

  6. NYOJ-756重建二叉树

    重建二叉树 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 题目很简单,给你一棵二叉树的后序和中序序列,求出它的前序序列(So easy!). 输入 输入有多组数据(少于 ...

  7. 数据结构算法C语言实现(二十)--- 6.3.1遍历二叉树

    一.简述 二叉树的遍历主要是先序.中序.后序及对应的递归和非递归算法,共3x2=6种,其中后序非递归在实现上稍复杂一些.二叉树的遍历是理解和学习递归及体会栈的工作原理的绝佳工具! 此外,非递归所用的栈 ...

  8. 【面经】用递归方法对二叉树进行层次遍历 && 二叉树深度

    void PrintNodeAtLevel(BiTree T,int level) { // 空树或层级不合理 ) return; == level) { cout << T->da ...

  9. 树(二)——二叉树

    目录 本章主要讲解内容为: 树的非递归遍历算法,两种版本 树的扩展前缀以及前缀中缀构建方法 源码 btree.cpp btree.h 基础知识 一.定义 二叉树的递归定义:二叉树是每个结点最多含有两棵 ...

  10. c语言二叉树基本操作

    编译器为vs2013 #include "stdafx.h" #include<malloc.h> #include<stdlib.h> #define O ...

随机推荐

  1. 几款优秀的点播、RTSP/RTMP直播播放器介绍

    1.ijkplayer 项目地址: https://github.com/Bilibili/ijkplayer 介绍:Ijkplayer 是Bilibili发布的基于 FFplay 的轻量级 Andr ...

  2. 第十二章 Kubernetes的服务暴露插件--traefik

    1.前言 之前部署的coredns实现了k8s的服务在集群内可以被自动发现,那么如何使得服务在k8s集群外被使用和访问呢? 使用nodeport星的Service:此方法只能使用iptables模型, ...

  3. 华南理工大学 Python第5章课后小测-2

    1.(单选)下面语句的输出结果是: ls = [] def func(a, b): ls.append(b) return a*b s = func("hi", 2) print( ...

  4. 安装配置docker&maven环境

     原文视频:(https://blog.sechelper.com/20220919/code-review/docker-maven-install-guid/) Docker是什么 Docker ...

  5. Gitea 与 Drone 集成实践:完全基于 Docker 搭建的轻量级 CI/CD 系统

    Drone 是一个使用 Go 语言编写的自助式的持续集成平台,和 Gitea 一样可以完全基于容器部署,轻松扩展流水线规模.开发者只需要将持续集成过程通过简单的 YAML 语法写入 Gitea 仓库目 ...

  6. EFK-5: ES集群开启用户认证

    转载自:https://mp.weixin.qq.com/s?__biz=MzUyNzk0NTI4MQ==&mid=2247483826&idx=1&sn=583e9a5260 ...

  7. SecureCRT使用之自动记录日志功能

    自动记录日志功能: 选择"选项"--"全局选项",打开全局选项,在常规设置中找到"默认会话"设置项,点击右侧的"编辑默认设置&qu ...

  8. 10. Fluentd部署:高可用配置

    对于高访问量的web站点或者服务,可以采用Fluentd的高可用配置模式. 消息分发语义 Fluentd设计初衷主要是用作事件日志分发系统的.这类系统支持几种不同的分发模式: 至多一次.消息被立即发送 ...

  9. 改善C#程序的方法-1 操作字符串

    正确操作字符串 引言: 字符串是使用很频繁的一种数据类型. 如果使用不慎,则会为一次字符串操作所带来的额外性能开销而付出代价. 下面从这几个方面来探讨如何正确操作字符串: 1.确保尽量少的装箱,尽可能 ...

  10. aws-cli命令-ec2实例相关的操作

    aws上可以使用aws-cli的方式管理实例,记录一些常用的操作 1.启动.关闭.终止实例(目前笔者发现只能通过指定实例ID进行管理) # 启动/关闭/重启 指定的实例 aws ec2 start-i ...