【数据结构基础笔记】【树】

代码参考《妙趣横生的算法.C语言实现》

文章目录

  • 前言
    • 1、树的概念
    • 2、二叉树
    • 3、二叉树的遍历
    • 4、创建二叉树
    • 5、实例分析


前言

本章总结:树的概念、二叉树的创建、遍历


1、树的概念

树结构是以分支关系定义得一种层次结构。
树的定义:树是由n(n>=0)个结点组成的有穷集合。在任意的一棵非空树中:
1、有且仅有一个称为根(root)的结点
2、当n>1时,其余的结点分为m(m>0)个互不相交的有限集合T1,T2,T3,…Tm.其中每个集合本身又是一棵树,并称为跟的子树(SubTree)
在这里插入图片描述
以上图为例,A是root,BCD是A的child,以BCD为根节点构成3棵树,为A的字·SubTree。
树的存储形式:多重链表,在多重链表中每个结点由一个数据域和若干个指针域组成,其中每个指针域指向该结点的一个孩子结点。
多重链表结点类型描述:

#define MaxChild 10
typedef struct node {ElemType data;struct node* child[MaxChild];			//指向孩子结点的指针数组,将父节结点和子结点联系起来
};

在利用多重链表表示树结构时分定长结点(每个结点的指针域个数固定)和不定长结点(每个结点的指针域个数不固定)
在这里插入图片描述
对于二叉树来说,一个结点至多可以有左右两个孩子结点,或者只有一个孩子结点,或者没有孩子结点。
T是一个指针,指向二叉树的根结点。只有得到T,才能访问整个树结构。

2、二叉树

二叉树的递归定义:二叉树是这样的树结构,它或者为空,或者由一个根结点加上两棵分别称为左子树和右字数的互不相交的二叉树组成。

二叉树结点有三个域,lchild、rchild为指针域,用来指向该结点的左孩子和右孩子。data是数据域,用来存放该结点中包含的数据。

//二叉树结点定义
typedef struct BiTNode {ElemType data;struct BiTNode* lchild, * rchild;
}BiTNode,*BiTreee;
//二叉树结点类BiTNode,二叉树每个结点都属于该类型
//BiTree是一个指向BiTNode类型数据的指针

3、二叉树的遍历

从一个结点(一般来说是根结点)出发,按一定规律访问二叉树的全部结点,每个结点只访问一次。

应用二叉树递归地逻辑特性,采用递归方法遍历二叉树。

1、先序遍历

1、访问根结点

2、先序遍历左子树

3、先序遍历右子树

2、中序遍历

1、中序遍历左子树

2、访问根结点

3、中序遍历右子树

//定义visit函数
//访问结点,输出结点的层数
void visit(char c)
{printf("%c is at %d the level of BiTree\n");
}
//**********************遍历二叉树*********************//
//先序遍历
void PreOrderTraverse(BiTreee T)
{if (T)				//递归结束条件,T为空{visit(T->data);		//访问根结点PreOrderTraverse(T->lchild);		//先序遍历左子树PreOrderTraverse(T->rchild);		//先序遍历右子树}
}
//中序遍历
void InOrderTraverse(BiTreee T)
{if (T)				//递归结束条件,T为空{InOrderTraverse(T->lchild);		//先序遍历左子树visit(T->data);		//访问根结点InOrderTraverse(T->rchild);		//先序遍历右子树}
}
//后序遍历
void PosOrderTraverse(BiTreee T)
{if (T)				//递归结束条件,T为空{PosOrderTraverse(T->lchild);		//先序遍历左子树PosOrderTraverse(T->rchild);		//先序遍历右子树visit(T->data);		//访问根结点}
}

4、创建二叉树

借鉴二叉树的遍历算法也可以逐个生成结点,从而创建出一个二叉树。

//先序创建一棵二叉树
void CreateBiTree(BiTreee* T)
{char c;scanf("%c",&c);if (c == ' ') *T = NULL;else{*T = (BiTNode *)malloc(sizeof(BiTNode));		//创建根结点(*T)->data = c;									//向根结点中输入数据CreateBiTree(&((*T)->lchild));					//递归地创建左子树CreateBiTree(&((*T)->rchild));					//递归地创建右子树}
}
//依次输入:ABC  D  E F  //
//空格是递归结束的标志,当创建到叶子结点时,因为叶子结点的左右子树都为空,因此要输入空格表示结束。在创建二叉树的过程中,程序总是按照:创建根结点-创建左子树-创建右子树顺序进行

5、实例分析

用先序创建一棵树,并输出每个字符位于二叉树的层数
在这里插入图片描述

#include "stdio.h"
#include "malloc.h"
#include "conio.h"
#include <stdlib.h>
#include <math.h>
typedef char ElemType ;
#define MaxChild 10
typedef struct node {ElemType data;struct node* child[MaxChild];			//指向孩子结点的指针数组,将父节结点和子结点联系起来
};
//在利用多重链表表示树结构时分定长结点(每个结点的指针域个数固定)和不定长结点(每个结点的指针域个数不固定)
//对于二叉树来说,一个结点至多可以有左右两个孩子结点,或者只有一个孩子结点,或者没有孩子结点。
//T是一个指针,指向二叉树的根结点。只有得到T,才能访问整个树结构。//二叉树结点定义
typedef struct BiTNode {ElemType data;struct BiTNode* lchild, * rchild;
}BiTNode,*BiTreee;
//二叉树结点类BiTNode,二叉树每个结点都属于该类型
//BiTree是一个指向BiTNode类型数据的指针//定义visit函数
//访问结点,输出结点的层数
void visit(char c,int level)
{printf("%c is at %d the level of BiTree\n",c, level);
}
//**********************遍历二叉树*********************//
//先序遍历
void PreOrderTraverse(BiTreee T,int level)
{if (T)				//递归结束条件,T为空{visit(T->data,level);		//访问根结点PreOrderTraverse(T->lchild, level+1);		//先序遍历左子树,层数+1PreOrderTraverse(T->rchild, level+1);		//先序遍历右子树,层数+1}
}
//中序遍历
void InOrderTraverse(BiTreee T, int level)
{if (T)				//递归结束条件,T为空{InOrderTraverse(T->lchild, level + 1);		//中序遍历左子树,层数+1visit(T->data, level);		//访问根结点InOrderTraverse(T->rchild, level+1);		//中序遍历右子树,层数+1}
}
//后序遍历
void PosOrderTraverse(BiTreee T, int level)
{if (T)				//递归结束条件,T为空{PosOrderTraverse(T->lchild, level + 1);		//中序遍历左子树,层数+1PosOrderTraverse(T->rchild, level+1);		//中序遍历右子树,层数+1visit(T->data, level);		//访问根结点}
}
//先序创建一棵二叉树
void CreateBiTree(BiTreee* T)
{char c;scanf("%c",&c);if (c == '@') *T = NULL;else{*T = (BiTNode *)malloc(sizeof(BiTNode));		//创建根结点(*T)->data = c;									//向根结点中输入数据CreateBiTree(&((*T)->lchild));					//递归地创建左子树CreateBiTree(&((*T)->rchild));					//递归地创建右子树}
}
//依次输入:ABC  D  E F  //
//空格是递归结束的标志,当创建到叶子结点时,因为叶子结点的左右子树都为空,因此要输入空格表示结束。在创建二叉树的过程中,程序总是按照:创建根结点-创建左子树-创建右子树顺序进行//测试程序
int main()
{int level = 1;BiTreee T = NULL;printf("创建二叉树\n");CreateBiTree(&T);			//创建二叉树printf("==================先序遍历==========================\n");PreOrderTraverse(T,level);			//先序遍历level = 1;printf("==================中序遍历==========================\n");InOrderTraverse(T, level);			//先序遍历level = 1;printf("==================后序遍历==========================\n");PosOrderTraverse(T, level);			//先序遍历level = 1;_getche();return 0;
}

效果:
在这里插入图片描述
结果显然对的,并且能够显示出三种遍历方式的具体遍历过程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/378206.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

可以自动撑起的html样式,好好玩:CSS3抖动样式CSS Shake让你的网页酷炫起来

之前在一些网站发现了一个好玩的样式&#xff0c;就是鼠标移到网站LOGO上&#xff0c;logo会自动抖动起来&#xff0c;显得非常炫酷。我也是十分感兴趣。自从本站新添加了一个视觉设计的分类之后&#xff0c;我也是想起来有个抖动CSS样式CSS Shake&#xff0c;所以今天给小伙伴…

爬虫项目(一)---采集最近一日世界各国的疫情数据信息

该内容出自黑马程序员教程 采集最近一日世界各国疫情数据 步骤&#xff1a; 发送请求&#xff0c;获取疫情首页从疫情首页中提取最近一日各国疫情字符串从最近一日各国疫情字符串中提取json格式字符串把json格式字符串转换为Python类型把Python类型的数据&#xff0c;以json…

【数据结构基础应用】【顺序表】

代码参考《妙趣横生的算法.C语言实现》、《剑指OFFER 名企面试官精讲典型编程题 第2版》等 文章目录前言1、合并两个顺序表前言 本章总结在看书过程中的一些关于顺序表的算法题并可能含有一些自己的一些疑问。题目数量不定&#xff0c;随阅历增加而增加&#xff1b; 1、合并两…

html上下滚动切换顶端tab,jQuery实现Tab菜单滚动切换的方法

本文实例讲述了jQuery实现Tab菜单滚动切换的方法。分享给大家供大家参考。具体如下&#xff1a;这是一款jQuery实现让你的Tab菜单滚动的代码,先运行一下看看效果咋样?是不是超不错,让你的网页变得灵动起来,不再静止,学习jquery的朋友也可作为范例来参考吧.运行效果截图如下&am…

[转载]十四步实现拥有强大AI的五子棋游戏

又是本人一份人工智能作业……首先道歉&#xff0c;从Word贴到Livewrter&#xff0c;好多格式没了&#xff0c;也没做代码高亮……大家凑活着看……想做个好的人机对弈的五子棋&#xff0c;可以说需要考虑的问题还是很多的&#xff0c;我们将制作拥有强大AI五子棋的过程分为十四…

爬虫项目(二)---采集从03月02号以来的世界各国疫情数据

该内容出自黑马程序员教程 采集从03月02号以来的世界各国疫情数据 步骤&#xff1a; Ⅰ&#xff0c;重构项目(一)的代码&#xff0c;以提高扩展性 把功能封装到一个类中每一个小功能变成一个方法通过run方法启动爬虫 import requests import re import json from bs4 impor…

【原创】StreamInsight查询系列(二十)——查询模式之检测间隙事件

上篇文章介绍了查询模式中如何检测异常事件&#xff0c;这篇博文将介绍StreamInsight中如何检测间隙事件。 测试数据准备 为了方便测试查询&#xff0c;我们首先准备一个静态的测试数据源&#xff1a;// 创建数据源&#xff0c;要注意的是4:16和4:30之间存在的事件间隙 var sou…

【数据结构基础应用】【查找和排序算法】

代码参考《妙趣横生的算法.C语言实现》 文章目录前言1、顺序查找2、折半查找3、直接插入排序4、选择排序5、冒泡排序6、希尔排序7、快速排序8、堆排序9、排序算法性能比较10、所有算法的code&#xff08;C语言&#xff09;前言 本章总结查找和排序算法&#xff1a;顺序查找、折…

爬虫项目(三)---采集最近一日全国各省疫情数据

该内容出自黑马程序员教程 采集最近一日全国各省疫情数据 当然&#xff0c;数据来源仍然是丁香园新型冠状病毒肺炎疫情实时动态首页 url&#xff1a;https://ncov.dxy.cn/ncovh5/view/pneumonia 思路&#xff1a;首先需要先确定全国各省疫情数据的位置 全国各省份的疫情数据…

计算机专业博士后排名,排名丨计算机专业领域TOP10,性价比超高!

原标题&#xff1a;排名丨计算机专业领域TOP10&#xff0c;性价比超高&#xff01;相信各位家长、同学已经看过太多专业的排名&#xff0c;我问过很多理科生将来想学什么专业&#xff0c;听到频率最高的还是计算机专业。似乎大家都知道&#xff0c;学计算机是比较挣钱的&#x…

js 命名规范

转载于:https://www.cnblogs.com/zjx2011/p/3165043.html

爬虫项目(四)---采集从01月22日以来全国各省疫情数据

采集从03月02日以来全国各省疫情数据 当然&#xff0c;数据来源仍然是丁香园新型冠状病毒肺炎疫情实时动态首页 url&#xff1a;https://ncov.dxy.cn/ncovh5/view/pneumonia 分析 确定01月22日以来全国各省疫情数据的URL 由项目(三)可以获取全国各省疫情数据点击可下载&…

纠错码trick和数据压缩trick

纠错码和压缩算法是同一枚硬币的两面。 两者都来自于对冗余的想法。 纠错码被视为向消息或文件中添加冗余的原则性方法。而压缩算法正好相反&#xff0c;他们会从消息或文件中移除冗余。 压缩和纠错并不是彼此抵消的&#xff0c;相反&#xff0c;好的压缩算法会移除抵消冗余&am…

常用算法总结(穷举法、贪心算法、递归与分治算法、回溯算法、数值概率算法)

博主联系方式&#xff1a; QQ:1540984562 QQ交流群&#xff1a;892023501 群里会有往届的smarters和电赛选手&#xff0c;群里也会不时分享一些有用的资料&#xff0c;有问题可以在群里多问问。 目录1、穷举法2、贪心算法3、递归与分治算法4、回溯算法5、数值概率算法1、穷举法…

工程师英语和计算机证书查询,点击进入国家硬件维修工程师证书查询网站

工程师证书查询网站人力资源社会保障部指定查询国家职业资格证书的唯一官方网站。涵盖全国各省市、各行业、各央企颁发的证书。电脑硬件维修工程师网上能查看国家工信部硬件维修工程师证书查询网址&#xff1a;http://www.ceiaec.org/index.htm工程师证书编号在网上怎么查询如果…

敏捷开发“松结对编程”系列之七:问题集之一

本文是“松结对编程”系列的第七篇。&#xff08;之一&#xff0c;之二&#xff0c;之三&#xff0c;之四&#xff0c;之五&#xff0c;之六&#xff0c;之七&#xff0c;之八&#xff09;刚刚参加完MPD 2011深圳站&#xff0c;在演讲中间及后来媒体采访&#xff0c;被问到了一…

C++中的sort函数对二维数组排序是按照什么准则?

遇到的一个疑惑&#xff0c;现记录如下&#xff1a; int main() {vector<vector<int>> envelopes { {5, 8},{6, 7},{6, 4},{2, 3},{8,9} };sort(envelopes.begin(), envelopes.end());for (int i 0;i < envelopes.size();i)cout << envelopes[i][0]<…

数学专业学计算机哪一行,计算数学

计算数学(一个理科专业)语音编辑锁定讨论上传视频计算数学是由数学、物理学、计算机科学、运筹学与控制科学等学科交叉渗透而形成的一个理科专业。中文名计算数学外文名Computational Mathematics所 属数学计算数学专业定义编辑语音计算数学也叫做数值计算方法或数值分析。主…

图片透视变换操作

由于照相机硬件设备本身的误差&#xff0c;可能会导致镜头畸变&#xff0c;从而导致照相机拍摄到的照片产生失真现象&#xff0c;此时可以通过透视变换去适当的校正。 大概的思路&#xff1a;在原图像上确定四个点&#xff0c;然后再新图像上也确定四个点&#xff0c;通过warp…

dp笔记:关于DP算法和滚动数组优化的思考

从网上总结了一些dp的套路以及对滚动数组的一些思考&#xff0c;现记录如下&#xff0c;希望以后回顾此类算法时会有所帮助。 目录1、DP算法经验1、DP算法核心&#xff1a;2、DP算法类别以及例题例1&#xff1a;三步问题例2&#xff1a;最小路径和例3&#xff1a;乘积最大子数组…