第四章 树(1)

来源:互联网 发布:淘宝客服旺旺操作 编辑:程序博客网 时间:2024/04/30 22:12

预备知识

树的递归定义:一棵树是一些节点的集合,这些集合可以是空集;若非空,则一棵树由根节点r和0个或多个非空的子树T1,T2,…,Tk组成,这些子树中的每一棵的根都被来自根r的一条有向边所连接。

树的这种递归定义使得在编写有关树的程序时递归地编写比较方便。

 

从节点n1到nk的路径的长定义为该路径上边的数目。

 

对任意节点nini的深度是从根到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;}


原创粉丝点击