第四章 树(1)
来源:互联网 发布:淘宝客服旺旺操作 编辑:程序博客网 时间:2024/04/30 22:12
预备知识
树的递归定义:一棵树是一些节点的集合,这些集合可以是空集;若非空,则一棵树由根节点r和0个或多个非空的子树T1,T2,…,Tk组成,这些子树中的每一棵的根都被来自根r的一条有向边所连接。
树的这种递归定义使得在编写有关树的程序时递归地编写比较方便。
从节点n1到nk的路径的长定义为该路径上边的数目。
对任意节点ni,ni的深度是从根到ni的唯一路径长。根的深度是0。
ni的高是从ni到一片树叶的最长路径长。所有的树叶高都是0。一棵树的高等于它根的高。
一棵树的深度等于它最深的树叶的深度,也等于根的高。
树的实现可以采用左孩子右兄弟的方法。
树的遍历及应用
1. 用作UNIX、VAX/VMS和DOS等许多常用操作系统中的目录结构。
不同目录下的两个文件可以同名,因为不同目录下的两个文件必然有从树根开始的不同路径名。
先序遍历:在先序遍历中,对节点的处理工作是在它的诸儿子节点被处理之前进行的。
2. 计算每个文件占用磁盘块的个数。
后序遍历:在后序遍历中,对节点的处理工作实在它的诸儿子节点被计算后进行的。
二叉树
每个节点不能有多于两个儿子的树。
具有N个节点的每个二叉树都需要有N+1个NULL指针。
表达式树:
前序遍历:节点,左,右
中序遍历:左,节点,右
后序遍历:左,右,节点
二叉查找树:
#include "BinarySearchTree.h"#include <iostream>using namespace std;struct TreeNode {ElementType Element;SearchTree Left;SearchTree Right;};SearchTree MakeEmpty(SearchTree T){if (T!=NULL) {MakeEmpty(T->Left);MakeEmpty(T->Right);delete T;}return NULL;}Position Find(ElementType X, SearchTree T){if (T==NULL)return NULL;else if (T->Element<X)return Find(X, T->Right);else if (T->Element>X)return Find(X, T->Left);elsereturn T;}Position FindMin(SearchTree T){if (T==NULL)return NULL;else if (T->Left==NULL)return T;elsereturn FindMin(T->Left);}Position FindMax(SearchTree T){if (T==NULL)return NULL;else if (T->Right==NULL)return T;elsereturn FindMax(T->Right);}SearchTree Insert(ElementType X, SearchTree T){if (T==NULL) {T = new struct TreeNode;if (T==NULL) {cout<<"out of memory, new element failed"<<endl;return NULL;} else {T->Element = X;T->Left = T->Right = NULL;}} else if (T->Element<X)T->Right = Insert(X, T->Right); else if (T->Element>X)T->Left = Insert( X, T->Left);//else T->Element==X,we will do nothingreturn T;}SearchTree Delete(ElementType X, SearchTree T){Position TempCell;if (T==NULL) {cout<<"Element not found"<<endl;return NULL;} else if (T->Element<X)T->Right = Delete(X, T->Right);else if (T->Element>X)T->Left = Delete(X, T->Left);else if (T->Left && T->Right) {TempCell = FindMin(T->Right);T->Element = TempCell->Element;T->Right = Delete(T->Element, T->Right);} else {TempCell = T;if (T->Left==NULL)T = T->Right;else if (T->Right==NULL)T = T->Left;delete TempCell;}return T;}void PrintTree(SearchTree T){if (T==NULL)return;else {cout<<T->Element<<" ";PrintTree(T->Left);PrintTree(T->Right);}}int main(int argc, char **argv){Position T = NULL;T = Insert(6, T);T = Insert(2, T);T = Insert(8, T);T = Insert(1, T);T = Insert(4, T);T = Insert(3, T);cout<<(FindMin(T))->Element<<endl;cout<<(FindMax(T))->Element<<endl;PrintTree(T);cout<<endl;Delete(1, T);PrintTree(T);cout<<endl;Delete(6, T);PrintTree(T);cout<<endl;system("pause");return 0;}
- 第四章 树(1)
- 第四章 树(一)
- 第四章 树(二)
- 1,第四章
- 第四章1
- 第四章总结1
- 第四章1-4
- 第四章上机1
- 第四章 上机1
- 第四章第四题
- 第四章第四题
- 第四章 树(2)
- 第四章第1题
- 第四章 复合类型(1)
- C#第四章 示例1
- 第四章
- 第四章
- 第四章
- hibernate中 多对一
- How browsers work
- 【xcode】最新版xcode4.6.X使用老的simulator6.0 5.1 5.0
- Oracle字符集的查看查询和Oracle字符集的设置修改
- 单页面跳转逻辑
- 第四章 树(1)
- Statistical Formulas For Programmers
- Android、iPhone、Windows Phone设计规范汇总
- 【每天一个Linux命令】03. Linux中管道命令的用法
- jquery实现验证码发送以及验证码的有效时间30分钟实现方式
- C# 使用API读写Ini文件的类
- CPL DPL RPL的区别 &&一致性代码段和非一致性代码段
- 管理小故事1
- 在dos中运行java程序,出现Exception in thread "main" java.lang.NoClassDefFoundError的原因