树、二叉树、遍历二叉树的总结

首先介绍树:

如上图所示就是一棵树,先介绍树的几个关键名词:

节点:A、B、C、D等都叫节点

节点的度:节点有几个分支,就叫节点的度,比如节点B有2个分支,那B的度为2

终端节点(叶子):没有分支的节点,如E、F、G、H

非终端节点:有分支的节点,如A、B、D、C

节点的层次:自上而下排列层次,A为1层,B为2层,D为3层

树的度:哪个节点的度最大,这个最大的度就是树的度,如图树的度为2

树的深度:简而言之,就是树有几层,如图的树的深度为4

我们接触最多的树是二叉树

二叉树:在计算机科学中,二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。

二叉树的5种基本形态:

注意:(a)的意思是二叉树没有任何节点

满二叉树:除最后一层无任何子节点外,每一层上的所有结点都有两个子结点(最后一层上的无子结点的结点为叶子结点)。也可以这样理解,除叶子结点外的所有结点均有两个子结点。节点数达到最大值。所有叶子结点必须在同一层上。

假如满二叉树有K层,那么他总结点数是:2^k-1,第k层的结点数是:2^(k-1)

完全二叉树:若设二叉树的深度为k,除第k 层外,其它各层(1~k-1)的结点数都达到最大个数,第
k 层所有的结点都连续集中在最左边,这就是完全二叉树。

完全二叉树是指最后一层左边是满的,右边可能满也可能不满,然后其余层都是满的。可以这么看完全二叉树:对满二叉树的最后一排自右往左剪叶子。

平衡树

二叉树是一种非平衡树,各个子树之间的高度可能相差很大,这样就造成平均性能的下降。为了使各个子树的高度基本保持平衡,平衡树就应运而生了。

平衡树包括很多种类,常见的有B树、AVL树、红黑树等。B树主要应用于文件系统、数据库等方面,而AVL树和红黑树多用于检索领域。

红黑树

红黑树是每个节点都带有颜色属性的二叉查找树,颜色或红色或黑色。在二叉查找树强制一般要求以外,对于任何有效的红黑树我们增加了如下的额外要求:

性质1.
节点是红色或黑色。

性质2.
根节点是黑色。

性质3 每个叶节点(NIL节点,空节点)是黑色的。

性质4 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)

性质5.
从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

红黑树

二叉树的遍历:

先序遍历:根左右,首先访问根结点,然后遍历左子树,最后遍历右子树

中序遍历:左根右,首先遍历左子树,然后访问根结点,最后遍历右子树

后序遍历:左右根,首先遍历左子树,然后遍历右子树,最后访问根结点

可以看出,前序、中序、后序分别是以根的位置来命名的,比如“根左右”,根最前,所以命名为前序;“左根右”,根排第二,所以叫中序。也可以这么理解:“根”“左”“右”分别是三种东西,谁排前头谁就先遍历谁。值得注意的是,“左”一定比“右”拍的靠前。

小试牛刀:

如上图

前序遍历:FCADBEGHP

中序遍历:ACBDFEHGP

后序遍历:ABDCHPGEF

再来一个复杂的:

如上图

前序遍历:ABMCDEFGHK

中序遍历:MBDCAEHGKF

后序遍历:MDCBHKGFEA

时间: 2024-07-31 14:23:03

树、二叉树、遍历二叉树的总结的相关文章

35. 蛤蟆的数据结构笔记之三十五遍历二叉树

35. 蛤蟆的数据结构笔记之三十五遍历二叉树 本篇名言:"冬天已经到来,春天还会远吗? --雪莱" 我们来看徐璈如何遍历二叉树. 欢迎转载,转载请标明出处: 1.  二叉树遍历 二叉树的遍历有三种方式,如下: (1)前序遍历(DLR),首先访问根结点,然后遍历左子树,最后遍历右子树.简记根-左-右. (2)中序遍历(LDR),首先遍历左子树,然后访问根结点,最后遍历右子树.简记左-根-右. (3)后序遍历(LRD),首先遍历左子树,然后遍历右子树,最后访问根结点.简记左-右-根. 2.

不一样的二叉树遍历(小学生都会)

二叉树遍历 二叉树的遍历分为三种,分别是前序遍历,中序遍历和后序遍历.(在这里,我会介绍两种方法) 前序遍历:先根后左子树最后右子树. 中序遍历:先左子树后根最后右子树. 后序遍历:先左子树后右子树最后根. 举个中序遍历例子 原图网址:http://image.mamicode.com/info/201911/20191109200825797613.png 其它的遍历可以以此类推.这是标准的二叉树遍历方法. 高端方法 刚才的做法很标准,也很好理解,但有些慢.下面的方法显然要省时,简单一些. -

【树4】二叉树的遍历

简介 遍历二叉树就是按照某种顺序,将树中的结点都枚举一遍,且每个结点仅仅访问一次.因为树不是线性的结构,遍历不像线性表那样简单,因此他的遍历需要特点的算法来完成. 从某种角度讲,对二叉树的遍历就是将树形结构转换为线性结构的操作. 二叉树的遍历方法主要有如下几种: 先序遍历:先访问root结点,再先序遍历左子树,再先序遍历右子树. 中序遍历:先中序遍历左子树,再访问root结点,再中序遍历右子树. 后序遍历:先后序遍历左子树,再后序遍历右子树,再访问root结点. 层遍历:从上到下,从左到右,一层

数据结构与算法 3:二叉树,遍历,创建,释放,拷贝,求高度,面试,线索树

[本文谢绝转载,原文来自http://990487026.blog.51cto.com] 树 数据结构与算法 3:二叉树,遍历,创建,释放,拷贝,求高度,面试,线索树 二叉树的创建,关系建立 二叉树的创建,关系建立2 三叉链表法 双亲链表: 二叉树的遍历 遍历的分析PPT 计算二叉树中叶子节点的数目:使用全局变量计数器 计算二叉树中叶子节点的数目:不使用全局变量计数器 无论是先序遍历,中序遍历,后序遍历,求叶子的数字都不变;因为本质都是一样的,任何一个节点都会遍历3趟 求二叉树的高度 二叉树的拷

二叉树总结(一)树的遍历

该文我会用来总结二叉树相关的知识 二叉树如下图: 二叉树的结构 struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; 二叉树构造方法 为了测试二叉树的的各种算法,我不得不写一个二叉树的构造方法,我主要是用层次遍历的方式来构造二叉树的.层次遍历在后面会详细说到. 用字符串的方式来输入二叉树的序列,例如: 输入:1 2 3

javascript实现数据结构: 树和二叉树的应用--最优二叉树(赫夫曼树),回溯法与树的遍历--求集合幂集及八皇后问题

赫夫曼树及其应用 赫夫曼(Huffman)树又称最优树,是一类带权路径长度最短的树,有着广泛的应用. 最优二叉树(Huffman树) 1 基本概念 ① 结点路径:从树中一个结点到另一个结点的之间的分支构成这两个结点之间的路径. ② 路径长度:结点路径上的分支数目称为路径长度. ③ 树的路径长度:从树根到每一个结点的路径长度之和. 以下图为例: A到F :结点路径 AEF : 路径长度(即边的数目) 2 : 树的路径长度:3*1+5*2+2*3=19: ④ 结点的带权路径长度:从该结点的到树的根结

团体程序设计天梯赛 L2-006. 树的遍历 L2-011. 玩转二叉树

L2-006. 树的遍历 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <stdbool.h> 5 6 struct node 7 { 8 long left,right; 9 }tree[10000]; 10 11 long a[31],b[31]; 12 13 void work(long l,long r,long p,long q,long fa

树的遍历 (和) 玩转二叉树 的总结博客

树的遍历: 关键在与如何利用中序和后序建树. 中序的作用,提供了左右子树的所有节点的分布! 前序,后序的作用:就是第一个元素(最后一个元素)提供了根节点,让中序找到子树的分布情况. #include<iostream> #include<queue> #include<vector> using namespace std; const int maxn = 100; int af[maxn], in[maxn], n; struct node{ int l, r; }

数据结构 第5章 树的二叉树 单元小结(2)遍历二叉树和线索二叉树

概念: 遍历二叉树: 遍历:指按某条搜索路线遍访每个结点且不重复(又称周游). 遍历的用途:它是树结构插入.删除.修改.查找和排序运算的前提,是二叉树一切运算的基础和核心. 时间效率: O(n) //每个结点最多访问两次 空间效率: O(n) //栈占用的最大辅助空间 用栈进行迭代运算 和队列很像 先序: 中序: void PreOrderlteration(BiTree T) void InOrderIteration(BiTree T) { stack<BiTree> s; stack&l

树四:遍历二叉树

二叉树遍历: 从根结点开始,按照某种次序依次访问二叉树中的所有结点. 前序遍历: 中序遍历: 后序遍历: 层次遍历: 代码实现: /* main.c */ #include <stdio.h> #include <stdlib.h> #include "BTree.h" #include "LinkQueue.h" /* run this program using the console pauser or add your own get