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

代码参考《妙趣横生的算法.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;所以今天给小伙伴…

linux技巧----查找某个正在执行的脚本

如果在机器上发现有执行的脚本&#xff0c;却不知道在哪&#xff0c;可以这样找 例如 # netstat -ltnp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp …

成功沟通的六要素

沟通在我们的生活、工作中必不可少&#xff0c;成功的沟通有助于事业成功&#xff0c;家庭美满&#xff01;下面分享一篇关于沟通的文章&#xff0c;成功沟通六要素&#xff1a; 当蜘蛛网连接起来&#xff0c;可以捆住一头狮子。——埃塞俄比亚谚语 与他人合作使我们可以实现比…

java中intvalue_Java Number intValue()方法与示例

java中intvalueNumber类intValue()方法 (Number Class intValue() method) intValue() method is available in java.lang package. intValue()方法在java.lang包中可用。 intValue() method is used to return the value denoted by this Number object converted to type int…

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

该内容出自黑马程序员教程 采集最近一日世界各国疫情数据 步骤&#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五子棋的过程分为十四…

Java BigDecimal plus()方法与示例

BigDecimal Class plus()方法 (BigDecimal Class plus() method) Syntax: 句法&#xff1a; public BigDecimal plus();public BigDecimal plus(MathContext ma_co);plus() method is available in java.math package. plus()方法在java.math包中可用。 plus() method is used…

爬虫项目(二)---采集从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…

git 项目过大问题解决

当项目过大时&#xff0c;git clone时会出现error: RPC failed; HTTP curl The requested URL returned error: Gateway Time-out的问题 解决方法很简单&#xff0c;在git clone时加上--depth1即可解决 克隆的项目只包含最近的一次commit的一个分支&#xff0c;体积很小&#x…

java bitset_Java BitSet hashCode()方法及示例

java bitsetBitSet类hashCode()方法 (BitSet Class hashCode() method) hashCode() method is available in java.util package. hashCode()方法在java.util包中可用。 hashCode() method is used to retrieve hash code for this bit set (BitSet). hashCode()方法用于检索此位…

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

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

MarshalHelper

1 public class MarshalHelper2 {3 /// <summary>4 /// 结构体转byte数组5 /// </summary>6 /// <param name”structObj”>要转换的结构体</param>7 /// <returns>转换后的byte数组</returns&g…

深入浅出SharePoint——InvokeWorkflow的妙用

应用场景&#xff1a;在Parallel Activity中使用InvokeWorkflow来达到间接关闭并行分支的功能。 TestInvokeWorkflow方法用于启动监听工作流。endinvoke方法用户关闭启动的监听工作流实例。 private void TestInvokeWorkflow(object sender, EventArgs e) { SPWeb web SPConte…

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

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

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

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

python set |_Python事件类| set()方法与示例

python set |Python Event.set()方法 (Python Event.set() Method) set() is an inbuilt method of the Event class of the threading module in Python. set()是Python中线程模块的Event类的内置方法。 When the set() method is called, the internal flag of that event c…

js 命名规范

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