(7)树

目录

树的知识点:

定义:

专业术语:

操作(重点):

树的操作:

创建二叉树:

先序遍历:

中序遍历:

后序遍历:


这篇笔记是根据郝斌老师的上课讲义整理而得。

树的知识点:

定义:

有且只有一个称为根的节点;有若干个互不相交的子树,这些子树本身也是一棵树。

通俗定义:树是由节点和边组成;每个节点只有一个父节点,可以有多个子节点; 但有一个节点例外,该节点没有父节点,此节点为根节点 。

专业术语:


    节点、父节点、子节点
    子孙、堂兄弟
    深度:从根节点到最底层节点的层数称之为深度
    叶子结点:没有子节点的节点
    非终端节点:实际就是非叶子节点。
    度:子节点的个数

分类:
    一般树:任意一个节点的子节点的个数都不受限制
    二叉树:任意一个节点的子节点的个数最多为两个,且子节点的位置不可变更
            分类:
                一般二叉树、
                满二叉树:在不增加树的层数的前提下,无法再多添加一个节点的二叉树就是满二叉树
                完全二叉树:如果只是连续删除了满二叉树最底层最右边的若干个节点,这样形成的二叉树就是完全二叉树
                            包含满二叉树
    森林:    n个互不相交的树的集合

存储:
    二叉树的存储
        连续存储[完全二叉树](重点)
            优点:查找某个节点的父节点和子节点(也包括判断有没有子节点)速度很快
            缺点:耗用内存 空间过大
            
        链式存储
            
    一般树的存储
        双亲表示法:求父节点方便
        孩子表示法:求子节点方便
        孩子双亲表示法:求父节点和子节点都很方便
        二叉树表示法:把一个普通树转化成二叉树来存储,
                    具体转换方法:设法保证任意一个节点的左指针域指向第一个孩子,右指针域指向下一个兄弟节点。
                    一个普通树转换成二叉树一定没有右子树。
    
    森林的存储
        把一个森林转化成二叉树来存储,
                具体转换方法:设法保证任意一个节点的左指针域指向第一个孩子,右指针域指向下一个兄弟节点。
                                一个森林转换成二叉树一定没有右子树。
    
 

操作(重点):


    遍历
        先序遍历[先访问根节点]:先访问根节点,再先序访问左子树,再先序访问右子树
        中序遍历(递归)[中间访问根节点]:中序遍历左子树,再访问根节点,再中序遍历右子树
                                        左---根节点---右子树,层层展开。
        后序遍历[最后访问根节点]:先中序遍历左子树,再中序遍历右子树,再访问根节点
        
    已知两种遍历序列求原始二叉树:
        通过先序和中序  或者  中序和后序可以还原出原始二叉树
        但是通过 先序和后序是无法还原出原始二叉树
        
        换种说法:只有通过先序和中序、中序和后序才可以唯一确定一个二叉树
        
        已知先序和中序求后序:
        实例1:
        先序:ABCDEFGH
        中序:BDCEAFHG
        后序:DECBHGFA
    
        实例2:
        先序:    ABDGHCEFI
        中序:    GDHBAECIF
        后序:    GHDBEIFCA
    
        已知中序和后序求先序:
        中序:BDCEAFHG
        后序:DECBHGFA
        先序;ABCDEFGH
        
树的应用:树是数据库中数据组织一种重要形式,操作系统子父进程的关系本身就是一棵树。
            面向对象语言中类的继承关系,霍夫曼树。

 

树的操作:

#include <stdio.h>
#include <malloc.h>struct BTNode
{int data;struct BTNode *pLchild;struct BTNode *pRchild;
};struct BTNode *CreateBtree(void);
void PreTraverseBTree(struct BTNode *);
void InTraverseBTree(struct BTNode *);
void PostTraverseBTree(struct BTNode *);int main(void)
{struct BTNode * pT = CreateBtree();//PreTraverseBTree(pT);InTraverseBTree(pT);PostTraverseBTree(pT);
}

创建二叉树:

struct BTNode *CreateBtree(void)
{struct BTNode *pA = (struct BTNode*)malloc(sizeof(struct BTNode));struct BTNode *pB = (struct BTNode*)malloc(sizeof(struct BTNode));struct BTNode *pC = (struct BTNode*)malloc(sizeof(struct BTNode));struct BTNode *pD = (struct BTNode*)malloc(sizeof(struct BTNode));struct BTNode *pE = (struct BTNode*)malloc(sizeof(struct BTNode));pA->data = 'A';pB->data = 'B';pC->data = 'C';pD->data = 'D';pE->data = 'E';pA->pLchild = pB;pA->pRchild = pC;pB->pLchild = pB->pRchild = NULL;pC->pLchild = pD;pC->pRchild = NULL;pD->pLchild = NULL;pD->pRchild = pE;pE->pLchild = pE->pRchild = NULL;return pA;
}

先序遍历:

void PreTraverseBTree(struct BTNode * pT)
{if(pT != NULL){printf("%c\n", pT->data);if(NULL != pT->pLchild){PreTraverseBTree(pT->pLchild);}if(NULL != pT->pRchild){PreTraverseBTree(pT->pRchild);}}
}

中序遍历:

void InTraverseBTree(struct BTNode * pT)
{if(pT != NULL){if(NULL != pT->pLchild){InTraverseBTree(pT->pLchild);}printf("%c\n", pT->data);if(NULL != pT->pRchild){InTraverseBTree(pT->pRchild);}}}

后序遍历:

void PostTraverseBTree(struct BTNode * pT)
{if(pT != NULL){if(NULL != pT->pLchild){PostTraverseBTree(pT->pLchild);}if(NULL != pT->pRchild){PostTraverseBTree(pT->pRchild);}printf("%c\n", pT->data);}}

 

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

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

相关文章

由浅到深理解ROS(6)-坐标转换

转自 ROS 中对于多坐标系的处理是使用树型表示&#xff0c;在机器人自主导航中&#xff0c;ROS会构建这几个很重要的坐标系&#xff1a; base_link: 一般位于tf tree的最根部&#xff0c;物理语义原点一般为表示机器人中心&#xff0c;为相对机器人的本体的坐标系。(base_foot…

【BZOJ - 3450】Tyvj1952 Easy(数学期望,期望的线性性)

题干&#xff1a; 某一天WJMZBMR在打osu~~~但是他太弱逼了&#xff0c;有些地方完全靠运气:( 我们来简化一下这个游戏的规则 有n次点击要做&#xff0c;成功了就是o&#xff0c;失败了就是x&#xff0c;分数是按comb计算的&#xff0c;连续a个comb就有a*a分&#xff0c;comb就…

吐血推荐收藏的学位论文排版教程(完整版)

目录 01.保存的高级选项设置 02.纸张设置为A4纸大小 03.设置页边距和装订线距离 04.度量衡的设置 05.创建“论文正文”样式 06.修改论文正文样式 07.设置并修改标题样式 08.给中英文摘要、附录、等大标题套用样式 09.两个Word文档之间进行并排查看 12.一键生成多级列…

由浅到深理解ROS(7)-URDF

转自 相信许多爱好者止步于昂贵的机器人价格。虽然有了Arduino&#xff0c;但一个载重能力很弱的机器人小车成本也得一两百块钱。搭建自己的机器人更是费时费力。 所以如果你只是普通机器人爱好者&#xff0c;或者还没想好要拿机器人做什么&#xff0c;那我们还是从模拟器开始…

Apollo进阶课程 ① | 带你纵览无人车

目录 1&#xff09;无人驾驶级别的分类 2&#xff09;无人驾驶技术的关键点 3&#xff09;火热的无人驾驶 不缺独角兽 原文链接&#xff1a;Apollo进阶课程 ① | 带你纵览无人车 Apollo自动驾驶进阶课程是由百度Apollo联合北京大学共同开设的课程&#xff0c;邀请百度Apoll…

【BZOJ - 4318】OSU!(概率dp,数学期望,期望的线性性)

题干&#xff1a; osu 是一款群众喜闻乐见的休闲软件。 我们可以把osu的规则简化与改编成以下的样子: 一共有n次操作&#xff0c;每次操作只有成功与失败之分&#xff0c;成功对应1&#xff0c;失败对应0&#xff0c;n次操作对应为1个长度为n的01串。在这个串中连续的 X个…

word2vec原理详解及实战

目录 1&#xff09;前言 1.1 语言模型 1.2N-gram模型 1.3词向量表示 2&#xff09;预备知识 2.1 sigmoid函数 2.2 逻辑回归 2.3贝叶斯公式 2.4 Huffman编码 3&#xff09;神经网络概率语言模型 4&#xff09;基于Hierarchial Sodtmax模型 4.1CBOW模型 4.2 Skip-gr…

计算机网络通讯协议

网络通讯&#xff1a; 就是要把特定意义的数据通过物理介质传送给对方。把电信号变成有意义的数据&#xff1a; 以字节为单位分组&#xff0c;标识好每一组电信号的信息特征&#xff0c;按照分组的顺序来依次发送。 以太网规定&#xff1a;一组电信号为一个数据包&#xff0c…

【CodeForces - 518D】Ilya and Escalator(概率dp,数学期望)

题干&#xff1a; Ilya got tired of sports programming, left university and got a job in the subway. He was given the task to determine the escalator load factor. Lets assume that n people stand in the queue for the escalator. At each second one of the tw…

Apollo进阶课程 ② | 开源模块讲解(上)

目录 1&#xff09;无人驾驶车介绍 2&#xff09;高精地图 3&#xff09;定位 4&#xff09;感知 5&#xff09;轨迹规划 6&#xff09;控制 7&#xff09;云端 原文链接&#xff1a;Apollo进阶课程 ② | 开源模块讲解&#xff08;上&#xff09; Apollo自动驾驶进阶课…

由浅到深理解ROS(9)- 几个基本概念的理解 坐标系 包

1.坐标系 最常用的就是map&#xff0c;odom&#xff0c;base_link&#xff0c;base_laser坐标系&#xff0c;这也是开始接触gmapping的一些坐标系。 map:地图坐标系&#xff0c;顾名思义&#xff0c;一般设该坐标系为固定坐标系&#xff08;fixed frame&#xff09;&#xff…

【POJ - 1698】Alice's Chance(网络流最大流,建图)

题干&#xff1a; Alice, a charming girl, have been dreaming of being a movie star for long. Her chances will come now, for several filmmaking companies invite her to play the chief role in their new films. Unfortunately, all these companies will start mak…

由浅到深理解ROS URDF教程

创建自己的URDF文件 1.1创建树形结构文件 在这部分教程中要创建的将是下面的图形所描述的机器人的urdf文件 图片中这个机器人是一个树形结构的。让我们开始非常简单的创建这个树型结构的描述文件&#xff0c;不用担心维度等的问题。创建一个my_robot.urdf文件&#xff0c;内容如…

wireshark基本使用及介绍

Wireshark使用 注&#xff1a;本文中使用的wireshark是3.2.2版本 捕获过滤器表达式 下面是常用的捕获过滤器&#xff0c;wireshark中&#xff1a;捕获->捕获过滤器 除此外&#xff0c;还可以指明传输方向&#xff0c;如&#xff1a;src&#xff08;源方向&#xff09;, …

1.2)深度学习笔记------神经网络的编程基础

目录 1&#xff09;Binary Classification 2&#xff09;Logistic Regression 3&#xff09;Logistic Regression Cost Function 4&#xff09;Gradient Descent 5&#xff09;Logistic Regression Gradient Descent&#xff08;重点&#xff09; 6&#xff09;Gradient …

IP、TCP、UDP、HTTP头部信息

IP头部信息 ip报文段格式 版本&#xff1a; 占4位&#xff0c;表明IP协议实现的版本号&#xff0c;当前一般为IPv4&#xff0c;即0100。报头长度 &#xff1a; 占4位&#xff0c;因为头部长度不固定&#xff08;Option可选部分不固定&#xff09;&#xff0c;所以需要标识…

ROS技术点滴 —— MoveIt!中的运动学插件

MoveIt!是ROS中一个重要的集成化开发平台&#xff0c;由一系列移动操作的功能包组成&#xff0c;提供运动规划、操作控制、3D感知、运动学等功能模块&#xff0c;是ROS社区中使用度排名前三的功能包&#xff0c;目前已经支持众多机器人硬件平台。 MoveIt!中的众多功能都使用插件…

1)机器学习基石笔记Lecture1:The Learning Problem

网上关于机器学习的课程有很多&#xff0c;其中最著名的是吴恩达老师的课程&#xff0c;最近又发现了NTU林轩田老师的《机器学习基石》课程&#xff0c;这门课也很好。课程总共分为4部分&#xff0c;总共分为16节课&#xff0c;今天来记录第一节课。 When Can Machines Learn?…

Apollo进阶课程 ③ | 开源模块讲解(中)

目录 1&#xff09;ISO-26262概述 2&#xff09;ISO-26262认证流程 3&#xff09;ISO-26262优点与缺陷 原文链接&#xff1a;Apollo进阶课程 ③ | 开源模块讲解&#xff08;中&#xff09; Apollo自动驾驶进阶课程是由百度Apollo联合北京大学共同开设的课程&#xff0c;邀请…

【CodeForces - 1047C】Enlarge GCD(数学,枚举,预处理打表,思维)

题干&#xff1a; F先生有n个正整数&#xff0c;a1&#xff0c;a2&#xff0c;...&#xff0c;an 他认为这些整数的最大公约数太小了,所以他想通过删除一些整数来扩大它 您的任务是计算需要删除的最小整数数,以便剩余整数的最大公约数大于所有整数的公约数. Input 3 1 2 4…