读数据结构与算法分析

树的概念

  • 一棵树是一些节点的集合,可以为空
  • 由称做根(root)的节点以及0个或多个非空子树组成,子树都被一条来自根的有向边相连

树的实现

思路

孩子兄弟表示法:树中的每个节点中除了数据为还有两个指针,一个指向其儿子,一个指向其兄弟。

树的节点声明

  1. typedef struct TreeNode *PrtToNode ;
  2. struct TreeNode
  3. {
  4. ElementType Element ;
  5. PrtToNode FirstChild ;
  6. PrtToNode NextSibling ;
  7. }

树的遍历

先序遍历

以打印文件目录为例

  1. void ListDir(DirectoryOrFile D,int Depth) //传进第一个目录和深度(第几级)
  2. {
  3. if( D 是一个合法的文件目录)
  4. {
  5. PrintName(D,Depth) ;//先序遍历,即先访问它的名字打印出来
  6. for(遍历 D 所有的孩子 C)
  7. ListDir(C,Depth + 1) ; //递归调用,遍历子树
  8. }
  9. }
  10. void ListDirectory(DirectoryOrFile D) //启动程序
  11. {
  12. ListDir(D,0) ;
  13. }

后序遍历

以计算文件目录大小为例

  1. void SizeDirectory(DirectoryOrFile D)
  2. {
  3. int TotalSize ;
  4. TotalSize = 0 ;
  5. if(D 是一个合法的文件目录)
  6. {
  7. TotalSize = FileSize(D) ;
  8. for(D 的每个孩子 C)
  9. TotalSize += SizeDirectory(C) ;
  10. }
  11. return TotalSize ;
  12. }

二叉树

是一颗每个节点都不能由多于两个儿子的树

实现

二叉查找树:左子树关键字小于父节点,右子树关键字大于父节点

节点声明和初始化

  1. struct TreeNode ;
  2. typedef struct TreeNode *Poisition ;
  3. typedef struct TreeNode *SearchTree ;
  4. SearchTree MakeEmpty(SearchTree T) ;
  5. Position Find(ElementType X, SearchTree T) ;
  6. Position FindMin(SearchTree T) ;
  7. Position FinMax(SearchTree T) ;
  8. SearchTree Insert(ElementType X, SearchTree T) ;
  9. SearchTree Delete(ElementType X, SearchTree T) ;
  10. ElementType Retrieve(Poisition P) ;
  11. struct TreeNode
  12. {
  13. ElementType Element ;
  14. PtrToNode Left ;
  15. PtrToNode Right ;
  16. }

Find操作

  1. Position Find(ElementType X, SearchTree T)
  2. {
  3. if(T == NULL)
  4. return NULL ;
  5. else if(X < T->Elements)
  6. return Find(X,T->Left) ;
  7. else if(X > T->Elements)
  8. return Find(X,T->Right) ;
  9. return T ;
  10. }

FindMin和FindMax操作

递归和非递归实现

  1. Position FindMin(SearchTree T)
  2. {
  3. if(T == NULL)
  4. return NULL ;
  5. else if(T->Left == NULL)
  6. return T ;
  7. else
  8. return FindMin(T->Left) ;
  9. }
  10. Position FindMax(SearchTree T)
  11. {
  12. if(T != NULL)
  13. while(T->Right != NULL)
  14. T = T->Right ;
  15. return T;
  16. }

Insert操作

  1. SearchTree Inesert(ElementType X, SearchTree T)
  2. {
  3. if(T == NULL)
  4. {
  5. T = malloc(sizeof(struct
  6. TreeNode)) ;
  7. if(T == NULL)
  8. FatalError("内存不足")
  9. T->Element = X ;
  10. T->Left = T->Right = NULL;
  11. }
  12. else if(X < T->Element)
  13. T-Left = Insert(X,T->Left) ;
  14. else if(X > T->Element)
  15. T-Right = Insert(X,T->Right) ;
  16. return T ;
  17. }

Delete操作

只有一个节点的情况,直接用子树顶替

由两个节点的情况,找到右子树最小的元素顶替它,并删除这颗树(这颗树肯定只有一个节点)

  1. SearchTree Delete(Element X, SearchTree T)
  2. {
  3. Position TmpCell ;
  4. if(T == NULL)
  5. Error("未找到")
  6. else if(X < T->Element)
  7. T->left = Delete(X,T-Left) ;
  8. else if(X > T->Element)
  9. T->Right = Delete(X,T->Right) ;
  10. else if(T->Left && T->Right)
  11. {
  12. TmpCell = FindMin(T->Right) ;
  13. T->Element = TmpCell->Element ;
  14. T->Right = Delete(TmpCell->Element,T->Right) ;
  15. }
  16. else
  17. {
  18. TmpCell = T ;
  19. if(T->Left == NULL)
  20. T = T->Right ;
  21. if(T->Right == NULL)
  22. T = T ->Left ;
  23. free(TmpCell) ;
  24. }
  25. return T ;
  26. }

树和二叉树 -数据结构(C语言实现)的更多相关文章

  1. [数据结构 - 第6章] 树之链式二叉树(C语言实现)

    一.什么是二叉树? 1.1 定义 二叉树,是度为二的树,二叉树的每一个节点最多只有二个子节点,且两个子节点有序. 1.2 二叉树的重要特性 (1)二叉树的第 i 层上节点数最多为 2n-1: (2)高 ...

  2. 数据结构(C语言版)-第5章 树和二叉树

    5.1  树和二叉树的定义 树(Tree)是n(n≥0)个结点的有限集,它或为空树(n = 0):或为非空树,对于非空树T:(1)有且仅有一个称之为根的结点:(2)除根结点以外的其余结点可分为m(m& ...

  3. 6-11-N皇后问题-树和二叉树-第6章-《数据结构》课本源码-严蔚敏吴伟民版

    课本源码部分 第6章  树和二叉树 - N皇后问题 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接☛☛☛ <数据结构-C语言版>(严蔚敏,吴伟民版)课本 ...

  4. 6-9-哈夫曼树(HuffmanTree)-树和二叉树-第6章-《数据结构》课本源码-严蔚敏吴伟民版

    课本源码部分 第6章  树和二叉树 - 哈夫曼树(HuffmanTree) ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接☛☛☛ <数据结构-C语言版> ...

  5. 【C#数据结构系列】树和二叉树

    线性结构中的数据元素是一对一的关系,树形结构是一对多的非线性结构,非常类似于自然界中的树,数据元素之间既有分支关系,又有层次关系.树形结构在现实世界中广泛存在,如家族的家谱.一个单位的行政机构组织等都 ...

  6. 数据结构( Pyhon 语言描述 ) — —第10章:树

    树的概览 树是层级式的集合 树中最顶端的节点叫做根 个或多个后继(子节点). 没有子节点的节点叫做叶子节点 拥有子节点的节点叫做内部节点 ,其子节点位于层级1,依次类推.一个空树的层级为 -1 树的术 ...

  7. 数据结构(C语言第2版)-----数组,广义表,树,图

    任何一个算法的设计取决于选定的数据结构,而算法的实现依赖于采用的存储结构. 之前线性表的数据元素都是非结构的原子类型,元素的值是不可再分的.下面学习的这两个线性表是很特殊的,其中数据元素本身也可能是一 ...

  8. Java数据结构之树和二叉树(2)

    从这里始将要继续进行Java数据结构的相关讲解,Are you ready?Let's go~~ Java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来 ...

  9. Java数据结构之树和二叉树

    从这里开始将要进行Java数据结构的相关讲解,Are you ready?Let's go~~ Java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来的 ...

随机推荐

  1. VS2013 类向导 "异常来自 HRESULT:0x8CE0000B" 解决方法

    转自 http://blog.csdn.net/skyloveyue/article/details/52105912 我用使用了第二种方法: 改变项目的位置 将项目从原来D盘的位置(D:\proje ...

  2. NSMutableArray和NSArray的常用方法及相互转换

    NSMutableArray和NSArray的常用方法及相互转换 // NSArray --> NSMutableArray NSMutableArray *myMutableArray = [ ...

  3. chromium之task

    // A task is a generic runnable thingy, usually used for running code on a // different thread or fo ...

  4. Java : logback简单配置

    需要把logback.xml文件放在类路径下,如果是spring boot项目可以用 logging.config=classpath:log/xxxxxx.xml来指定配置文件 logback la ...

  5. 第6章 HDFS HA配置

    目录 6.1 hdfs-site.xml文件配置 6.2 core-site.xml文件配置 6.3 启动与测试 6.4 结合ZooKeeper进行自动故障转移 在Hadoop 2.0.0之前,一个H ...

  6. 20190118-利用Python实现Pig Latin游戏

    1.利用Python实现Pig Latin字母游戏 “Pig Latin”是一个英语儿童文字改写游戏,整个游戏遵从下述规则:a. 元音字母是‘a’.‘e’.‘i’.‘o’.‘u’.字母‘y’在不是第一 ...

  7. rails中文本匹配相似度gem包对比

    测试数据 ["美科学家发现人体新器官","科学家发现新器官"],["曝高云翔悉尼被捕","高云翔涉性侵被捕"],[&qu ...

  8. 《HTML与CSS知识》系列分享专栏

    收藏HTML和CSS方面的技术文章,作为一个WEB开发者,必须要知道HTML和CSS方面的知识,即使作为后台开发者也应该知道一些常用的HTML和CSS知识,甚至架构师也要了解,这样才会开发出实用的网站 ...

  9. Lambda实战(多练习)

    import org.junit.Test; import java.math.BigDecimal; import java.time.LocalDate; import java.util.*; ...

  10. 数据结构之栈和队列及其Java实现

    栈和队列是数据结构中非常常见和基础的线性表,在某些场合栈和队列使用很多,因此本篇主要介绍栈和队列,并用Java实现基本的栈和队列,同时用栈和队列相互实现. 栈:栈是一种基于“后进先出”策略的线性表.在 ...