預備知識
樹的遞歸定義:一棵樹是一些節點的集合,這些集合可以是空集;若非空,則一棵樹由根節點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);
else
return T;
}
Position FindMin(SearchTree T)
{
if (T==NULL)
return NULL;
else if (T->Left==NULL)
return T;
else
return FindMin(T->Left);
}
Position FindMax(SearchTree T)
{
if (T==NULL)
return NULL;
else if (T->Right==NULL)
return T;
else
return 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 nothing
return 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;
}