第四章 樹(1)

預備知識

樹的遞歸定義:一棵樹是一些節點的集合,這些集合可以是空集;若非空,則一棵樹由根節點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);
	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;
}


發佈了29 篇原創文章 · 獲贊 46 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章