数据结构与算法之树

树的表示方式有

  1. 树形图表示法:逻辑结构描述直观
  2. 嵌套集合表示法(文氏图表示法)
  3. 凹入表示法
  4. 广义表表示法

二叉树

二叉树是另一种重要的树形结构,是度为2的有序树,它的特点是每个结点至多有两棵子树。

二叉树的递归定义

二叉树是n(n≥0)个结点的有限集。它或者是空集(n=0),或者同时满足以下两个条件:

(1) 有且仅有一个根结点;

(2) 其余的结点分成两棵互不相交的左子树和右子树。

二叉树的特点

如果二叉树的根结点只有一棵子树,必须明确区分它是左子树还是右子树,因为两者将构成不同形态的二叉树。

注意:二叉树不是树的特例。它们是两种不同的数据结构。

二叉树举例

二叉树的性质

性质1:在二叉树的第i层上至多有2i-1 个结点。 (i≥1)

性质2:深度为 k 的二叉树上至多含 2k-1 个结点(k≥1)

证明:

性质3:对任何一棵二叉树,若它含有n0个叶子结点、n2个度为2的结点,则必存在关系式:n0= n2+1。

即 叶子结点数=度2结点 + 1

性质4:具有n个结点的完全二叉树的深度为 [log2n] +1  下取整

证明:

性质5:

若对含 n 个结点的完全二叉树从上到下且从左至右进行 1 至 n 的编号,则对完全二叉树中任意一个编号为 i 的结点:

(1) 若 i=1,则该结点是二叉树的根,无双亲, 否则,编号为 ?i/2? 的结点为其双亲结点;

(2) 若 2i>n,则该结点无左孩子,否则,编号为 2i 的结点为其左孩子结点;

(3) 若 2i+1>n,则该结点无右孩子结点, 否则,编号为2i+1 的结点为其右孩子结点。

两类特殊的二叉树:

满二叉树

指的是深度为k且含有2k - 1个结点的二叉树。

特点:

(1)每一层上结点数都达到最大

(2)度为1的结点n1=0,树叶都在最下一层。

满二叉树结点层序编号方法:

从根结点起从上到下逐层(层内从左到右)对二叉树的结点进行连续编号。

 完全二叉树

树中所含的 n 个结点和满二叉树中编号为 1 至 n 的结点一一对应。

完全二叉树的特点:

1、满二叉树是完全二叉树,完全二叉树不一定是满二叉树;

2、在完全二叉树中,若某个结点没有左孩子,则它一定没有右孩子,即该结点必是叶结点。

 二叉树的存储结构:

 1.顺序存储结构

用一组地址连续的存储单元,以层序顺序存放二叉树的数据元素,结点的相对位置蕴含着结点之间的关系。

如完全二叉树

非完全二叉树,存储时必须将相应的位置空出来,使存放的结果符合完全二叉树的形状。

所以,二叉树顺序存储结构仅适用于完全二叉树。

若存储非完全二叉树时有可能对存储空间造成极大的浪费:

在最坏的情况下,一个深度为K且只有K个结点的右单支树需要2K-1个结点存储空间。

二叉树的链式存储结构

根据二叉树的非线性结构的特点,常用链式存储方式来表示二叉树。

二叉树的链式存储结构有3种,它们是二叉链表、三叉链表和线索链表。

二叉链表存储结构

把每个结点分成三个域:一个域存放结点本身的信息,另外两个是指针域,分别存放左、右孩子的地址。每个结点的结构表示为:

二叉链表的C 语言类型描述如下:

typedef char TElemType;
typedef struct Node {
    TElemType      data;
    struct Node  *lchild, *rchild;
} BiTNode, *BiTree;

三叉链表(带双亲指针的二叉链表)

原文地址:https://www.cnblogs.com/lisen10/p/10850336.html

时间: 2024-08-08 10:30:38

数据结构与算法之树的相关文章

python数据结构与算法 36 树的基本概念

树 学习目标 理解什么是树及使用方法 学会使用树实现映射 用列表实现树 用类和引用实现树 用递归实现树 用堆实现优先队列 树的例子 前面我们学习过栈和队列这类线性数据结构,并且体验过递归,现在我们学习另一种通用数据结构,叫做树.树在计算机科学中应用广泛,象操作系统.图形学.数据库系统.网络等都要用到树.树和他们在自然界中的表哥--植物树--非常相似,树也有根,有分枝,有叶子.不同之处是,数据结构的树,根在顶上,而叶子在底部. 在开始学习之前,我们来研究几个普通的例子.第一个是生物学上的分级树.图

python数据结构与算法 37 树的实现

树的实现 记住上一节树的定义,在定义的基础上,我们用以下的函数创建并操作二叉树: BinaryTree() 创建一个二叉树实例 getLeftChild() 返回节点的左孩子 getRightChild() 返回节点的右孩子 setRootVal(val) 把val变量值赋给当前节点 getRootVal() 返回当前节点对象. insertLeft(val) 创建一个新二叉树作为当前节点的左孩子 insertRight(val) 创建一个新二叉树作为当前节点的右孩子. 实现树的关键点是合适的存

java数据结构与算法之树基本概念及二叉树(BinaryTree)的设计与实现

[版权申明]未经博主同意,不允许转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/53727333 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) java数据结构与算法之栈(Stack)设

python数据结构与算法 39 树的遍历

树的遍历 在学习完成树的基本结构以后,我们开始研究一些树的应用模式.访问树的全部节点,一般有三种模式,这些模式的不同之处,仅在于访问节点的顺序不同.我们把这种对节点的访问称为"遍历",这三种遍历模式叫做前序.中序和后序.下面我们对遍历模式作更仔细的定义,同时研究使用这延续模式的例子. 前序遍历 在前序遍历中,先访问根节点,然后用递归方式前序遍历它的左子树,最后递归方式前序遍历右子树. 中序遍历 在中序遍历中,先递归中序遍历左子树,然后访问根节点,最后递归中序遍历右子树. 后序遍历 在后

数据结构与算法——前缀树和贪心算法(1)

介绍前缀树 何为前缀树?如何生成前缀树? 例子:一个字符串类型的数组arrl,另一个字符串类型的数组arr2.arr2中有哪些字符,是arr 1中 出现的?请打印.arr2中有哪些字符,是作为arr 1中某个字符串前缀出现的?请打印.arr2 中有哪些字符,是作为arr1中某个字符串前缀出现的?请打印arr2中出现次数最大的前缀. public class TrieTree { public static class TrieNode { public int path; public int

[数据结构与算法] : AVL树

头文件 1 typedef int ElementType; 2 3 #ifndef _AVLTREE_H_ 4 #define _AVLTREE_H_ 5 6 struct AvlNode; 7 typedef struct AvlNode *Position; 8 typedef struct AvlNode *AvlTree; 9 10 AvlTree MakeEmpty(AvlTree T); 11 Position Find(ElementType X, AvlTree T); 12

python数据结构与算法——字典树

1 class TrieTree(): 2 def __init__(self): 3 self.root = {} 4 5 def addNode(self,str): 6 # 树中每个结点(除根节点),包含到该结点的单词数,以及该结点后面出现字母的键 7 nowdict = self.root 8 for i in range(len(str)): 9 if str[i] not in nowdict: # 发现新的组合方式 10 nowdict[str[i]] = {'count':0,'

数据结构与算法——前缀树和贪心算法(2)

数的划分 将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序). 例如:n=7,k=3,下面三种分法被认为是相同的.1,1,5; 1,5,1; 5,1,1; 问有多少种不同的分法. 输入:n,k ( 6 < n ≤ 200,2 ≤ k ≤ 6 ) 输出:一个整数,即不同的分法. 示例1 输入 //两个整数 n,k ( 6 < n ≤ 200, 2 ≤ k ≤ 6 ) 7 3 输出 //1个整数,即不同的分法. 4 C++ 法一:记忆化搜索 方法为减而治之,把n划分成k份的答案就相当

java数据结构与算法之平衡二叉树(AVL树)的设计与实现

[版权申明]未经博主同意,不允许转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/53892797 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) java数据结构与算法之栈(Stack)设