数据结构-二叉树笔记

看完《数据结构与算法分析》(c描述)后对二叉树的一点总结

树的节点声明:

 1 typedef  int ElementType;
 2 typedef struct  TreeNode* Position;
 3 typedef Position  BiSearchTree;
 4
 5 struct TreeNode
 6 {
 7 ElementType Element;
 8 Position Left,Right;
 9
10 };

二叉查找树的定义如下:

1.二叉查找树首先是一棵二叉树;

2.二叉查找树除了是二叉树外,还具有以下性质:对于树中的任何一个节点X,其左子树中的所有节点的关键字均小于X的关键字的值;而其右子树中的所有关键字的值均大于X的关键字的值。

二叉查找树的常用操作:

BiSearchTree MakeEmpty(BiSearchTree Tree);
Position FindMin(BiSearchTree T);
Position FindMax(BiSearchTree T);
BiSearchTree Insert(ElementType X,BiSearchTree T);
BiSearchTree Delete(ElementType X, BiSearchTree T);

树的操作过程中大多数用到了递归,理解起来相对简单,下面主要讲一下删除操作

对于要被删除的节点

  1. 如果节点是一片树叶,那么可以直接删除
  2. 如果节点有一个儿子,则该节点可以在其父亲节点调整指针绕过该节点后被删除,如图

   若要删除节点4,则只需将其父亲节点2调整指针指向4的儿子节点3,如右图。需要注意的是,所删除的节点只有在指向它的指针已被省去的情况下才能被去掉

  3.对于有两个儿子的节点。一般用其右子树中的最小的数据代替该节点的数据,并用递归的方法同样去删除掉那个节点。因为右子树中的最小的节点不可能有左儿子,所以第二次删除就很容易。如下图显示一颗初始的树及其一个节点被删除后的结果。要被删除的节点是根的左儿子,其关键字为2.它被右子树中的最小数据3所代替,然后关键字3的原节点如前例那样被删除

二叉树的常用操作:

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3
  4
  5 typedef  int ElementType;
  6 typedef struct  TreeNode* Position;
  7 typedef Position  BiSearchTree;
  8
  9 struct TreeNode
 10 {
 11 ElementType Element;
 12 Position Left,Right;
 13
 14 };
 15
 16 BiSearchTree MakeEmpty(BiSearchTree Tree);
 17 Position FindMin(BiSearchTree T);
 18 Position FindMax(BiSearchTree T);
 19 BiSearchTree Insert(ElementType X,BiSearchTree T);
 20 BiSearchTree Delete(ElementType X, BiSearchTree T);
 21
 22
 23 //建立一颗空树
 24 BiSearchTree MakeEmpty(BiSearchTree Tree)
 25 {
 26     if(!Tree)
 27     {
 28         MakeEmpty(Tree->Left);
 29         MakeEmpty(Tree->Right);
 30         free(Tree);
 31     }
 32
 33     return NULL;
 34 }
 35
 36 //二叉查找树的查找
 37 Position Find(ElementType X,BiSearchTree T)
 38
 39 {
 40     if(T==NULL)
 41     {
 42         return NULL;
 43     }
 44     else
 45     {
 46         if(X<T->Element)
 47         {
 48             return Find(X,T->Left);
 49         }
 50         else if(X>T->Element)
 51         {
 52             return Find(X,T->Right);
 53         }
 54
 55         else
 56         {
 57             return T;
 58         }
 59     }
 60
 61 }
 62
 63
 64 //查找最小值(递归写法)
 65 Position FindMin(BiSearchTree T)
 66 {
 67     if(T==NULL)
 68     {
 69         return NULL;
 70     }
 71     else
 72     {
 73         if (T->Left==NULL)
 74         {
 75             return T;
 76         }
 77         else
 78         {
 79             return FindMin(T->Left);
 80         }
 81     }
 82 }
 83
 84
 85 //查找最大值(非递归写法)
 86 Position FindMax(BiSearchTree T)
 87 {
 88    if(T!=NULL)
 89    {
 90         while(T->Right!=NULL)
 91         {
 92             T=T->Right;
 93         }
 94    }
 95     return T;
 96 }
 97
 98
 99
100 //插入元素
101 BiSearchTree Insert(ElementType X,BiSearchTree T)
102
103 {   if(T==NULL)             //树为空时
104     {
105         T=malloc(sizeof(struct TreeNode));
106         if(T==NULL)
107         {
108             fprintf(stderr,"out of place");//stderr:标准错误文件
109         }
110         else
111         {
112             T->Element = X;
113             T->Left=NULL;
114             T->Right=NULL;
115         }
116     }
117     else                //树不为空时
118     {
119         if(X<T->Element)
120         {
121             T->Left=Insert(X,T->Left);
122         }
123
124         if(X>T->Element)
125         {
126             T->Right=Insert(X,T->Right);
127         }
128         else
129         {
130              //do nothing
131         }
132     }
133
134     return T;
135 }
136
137
138
139
140 //删除节点X
141 BiSearchTree Delete(ElementType X,BiSearchTree T)
142 {
143     Position TmpCell;
144     if(T==NULL)
145     {
146         fprintf(stderr,"Element does not exist!");
147     }
148     else if(X<T->Element)
149     {
150         T->Left=Delete(X,T->Left);
151     }
152     else if(X>T->Element)
153     {
154         T->Right=Delete(X,T->Right);
155     }
156     else if(T->Left&&T->Right)         //被删节点有两个孩子
157     {
158         TmpCell = FindMin(T->Right);
159         T->Element = TmpCell->Element;
160         T->Right = Delete(T->Element,T->Right);
161     }
162     else                         //被删节点有1个或是没有孩子
163     {
164         TmpCell =T;
165         if(T->Left==NULL)
166         {
167             T=T->Right;
168         }
169           if(T->Right==NULL)
170         {
171             T=T->Left;
172         }
173         free(TmpCell);
174     }
175     return T;
176 }
177
178
179 int main()
180 {
181     BiSearchTree T;
182     int index;
183     int arr[11]={2,8,45,78,111,354,5,676,89,34,45};
184     T=NULL;
185     for(index=0;index<11;index++)
186     {
187         T=Insert(arr[index],T);
188     }
189     T=Insert(100,T);
190     T=Insert(11,T);
191     printf("最小数是:%d\n",FindMin(T)->Element);
192     printf("最大数是:%d\n",FindMax(T)->Element);
193
194     return 0;
195 }
时间: 2024-10-14 05:49:44

数据结构-二叉树笔记的相关文章

小猪的数据结构学习笔记(四)

小猪的数据结构学习笔记(四) 线性表之静态链表 --转载请注明出处:coder-pig 本章引言: 在二,三中中我们分别学习了顺序表中的线性表与单链表,线性表有点类似于 我们前面所学的数组,而单链表使用的最多的是指针,这里问个简单的问题, 如果是在以前没有指针的话,前辈先人们怎么实现单链表呢?大家思考下! 没有指针,那么用什么来代替呢?前辈先人们非常机智,想出了使用下标+游标的方式 来实现单链表的效果!也就是今天要讲的--静态链表! 当然你也可以直接跳过本章,因为有了单链表就没有必要用静态链表了

小猪的数据结构学习笔记(二)

小猪的数据结构学习笔记(二) 线性表中的顺序表 本节引言: 在上个章节中,我们对数据结构与算法的相关概念进行了了解,知道数据结构的 逻辑结构与物理结构的区别,算法的特性以及设计要求;还学了如何去衡量一个算法 的好坏,以及时间复杂度的计算!在本节中我们将接触第一个数据结构--线性表; 而线性表有两种表现形式,分别是顺序表和链表;学好这一章很重要,是学习后面的基石; 这一节我们会重点学习下顺序表,在这里给大家一个忠告,学编程切忌眼高手低,看懂不代表自己 写得出来,给出的实现代码,自己要理解思路,自己

数据结构二叉树——建立二叉树、中序递归遍历、非递归遍历、层次遍历

数据结构二叉树-- 编写函数实现:建立二叉树.中序递归遍历.借助栈实现中序非递归遍历.借助队列实现层次遍历.求高度.结点数.叶子数及交换左右子树. ("."表示空子树) #include<stdio.h> #include<stdlib.h> //***********二叉树链表节点结构 typedef char DataType; typedef struct Node {  DataType data;  struct Node*LChild;  struc

POJ 3367 Expressions(数据结构-二叉树)

Expressions Description Arithmetic expressions are usually written with the operators in between the two operands (which is called infix notation). For example, (x+y)*(z-w) is an arithmetic expression in infix notation. However, it is easier to write

[数据结构] 二叉树的建立及其基本操作

如图: 代码: #include <iostream> #include <stdio.h> #include <algorithm> #include <string.h> using namespace std; char ch; typedef struct BinNode { char data; struct BinNode *lchild,*rchild; }BinNode,*BinTree; //二叉树链式存储结构 void CreateBin

小猪的数据结构学习笔记(五)

小猪的数据结构学习笔记(五) 线性表之--循环链表                           --转载请注明出处:coder-pig 循环链表知识点归纳: 相关代码实现: ①判断是否为空表: ②单循环链表的存储结构 其实和单链表的结构是一样的! /*定义循环链表的存储结构*/ typedef struct Cir_List { int data; struct Cir_List *next; }Lnode; ③初始化循环单链表 代码如下: //1.循环链表的初始化 //表示一个元素,如

数据结构学习笔记之栈

栈(stack)  是限定仅在表尾进行插入或删除操作的线性表.因此,对栈来说,表尾端有其特殊含义,称为栈项(top),相应地,表头端称为栈底(bottom).不含元素的空表称为空栈. 栈有两种存储表示方法:顺序栈和链栈.顺序栈,即栈的顺序存储结构是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置.通常的习惯做法是以top=0表示空栈,鉴于C语言中数组的下标约定从0开始,则当以C作描述语言时,如此设定会带来很大不便:另一方面,由于栈在使用过程

数据结构学习笔记(1)-数据结构与算法

基本概念和术语 1.数据  数据元素  数据对象   数据结构 数据:在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称. 数据元素:是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理. 数据对象:是性质相同的数据元素的集合.是数据的一个子集. 数据结构:是相互之间存在一种或多种特定关系的数据元素的集合. 2.数据结构 数据结构分为逻辑结构和物理结构 2.1逻辑结构 逻辑结构表示数据之间的相互关系.通常有四种基本结构: 集合:结构中的数据元素除了同属于一种类型外,别

【数据结构学习笔记(C#描述)】(二)算法分析

由上一章的内容可知软件质量的重要特征之一就是能够高效的利用资源(运行效率),因此我们就要考虑如何创建出能够高效利用CPU及内存的数据结构与算法.而算法分析的目的就是为了让我们能够认识到算法对于资源的利用效率. 我们要想分析算法的效率,就需要找到一个评价算法效率的标准及方法. 一般我们如果能快速的利用CPU就会更好的节省时间,因此在时间层面上我们的评价标准就是时间复杂度,而如果我们能够较好的利用内存的话我们将会节省更多的内存空间,因此在空间层面上我们的评价标准就是空间复杂度. 所谓时间复杂度和空间

数据结构--二叉树(定义与存储结构)

什么是二叉树 是具有n个节点的有限集合,由一个根节点和两棵互不相交二叉树组成.如图 从名字简单理解,就是具有2个树叉的树形结构,当然这不是绝对的,正如上图所示,我也可以只有一个树叉. 二叉树具有五种基本形态: (1)空二叉树 (2)只有一个根结点的二叉树 (3)只有左子树 (4)只有右子树 (5)既有左子树又有右子树 完全二叉树 这种二叉树,是二叉树中常用的专业术语,不是说一个完整的二叉树就是完全二叉树,这种二叉树叫满二叉树,如图 简单理解就像图片中,完全二叉树中每个节点的编号,都能映射到满二叉