複習記錄,高手無視,關於 二叉搜索樹的一些基本操做。ide
- //Code by Pnig0s1992
- //Date:2012,3,28
- #include <stdio.h>
- #include <stdlib.h>
- typedef int Element_type;
- typedef struct TreeNode * ptrTreeNode;
- typedef struct TreeNode * ADTTree;
- struct TreeNode
- {
- Element_type element;
- ptrTreeNode pLeftChild;
- ptrTreeNode pRightChild;
- };
- void MakeEmpty(ADTTree myTree);//將ADT樹置空
- ptrTreeNode Find(Element_type x,ADTTree myTree);//查找指定元素的結點並返回
- ptrTreeNode FindMin(ADTTree myTree);//查找ADT樹中的最小值
- ptrTreeNode FindMax(ADTTree myTree);//查找ADT樹中的最大值
- ptrTreeNode Insert(Element_type x,ADTTree myTree);//向ADT樹中插入結點
- ptrTreeNode Delete(Element_type x,ADTTree myTree);//ADT樹中刪除指定結點
- ADTTree CreateTree(Element_type x);//構造一個新ADT樹並返回根節點指針
- int main(int argc,char ** argv)
- {
- Element_type el = 6;
- ADTTree newTree = CreateTree(el);
- newTree = Insert(2,newTree);
- newTree = Insert(8,newTree);
- newTree = Insert(1,newTree);
- newTree = Insert(4,newTree);
- newTree = Insert(3,newTree);
- newTree = Delete(6,newTree);
- return 0;
- }
- //構建ADT樹
- ADTTree CreateTree(Element_type x)
- {
- ADTTree newTree = (ptrTreeNode)malloc(sizeof(TreeNode));
- newTree->element = x;
- newTree->pLeftChild = newTree->pRightChild = NULL;
- return newTree;
- }
- //向ADT樹中插入一個結點
- ptrTreeNode Insert(Element_type x,ADTTree myTree)
- {
- if(myTree == NULL)
- {
- myTree =(ptrTreeNode) malloc(sizeof(TreeNode));
- if(myTree == NULL)
- {
- printf("\nOut of space.");
- }
- else
- {
- myTree->element = x;
- myTree->pLeftChild = myTree->pRightChild = NULL;
- }
- }else if (x < myTree->element)
- {
- myTree->pLeftChild = Insert(x,myTree->pLeftChild);
- }else if (x > myTree->element)
- {
- myTree->pRightChild = Insert(x,myTree->pRightChild);
- }
- return myTree;
- }
- //找到ADT樹最小結點
- ptrTreeNode FindMin(ADTTree myTree)
- {
- if(myTree == NULL)
- {
- printf("\nThe tree is empty.");
- }else if (myTree->pLeftChild == NULL)
- {
- return myTree;
- }else
- {
- return FindMin(myTree->pLeftChild);
- }
- }
- //找到ADT樹最大結點
- ptrTreeNode FindMax(ADTTree myTree)
- {
- if(myTree == NULL)
- {
- printf("\nThe tree is empty.");
- }else if (myTree->pRightChild == NULL)
- {
- return myTree;
- }else
- {
- return FindMax(myTree->pRightChild);
- }
- }
- //刪除指定ADT樹結點
- ptrTreeNode Delete(Element_type x,ADTTree myTree)
- {
- ptrTreeNode TempCell;
- if(myTree == NULL)
- {
- printf("\nThe tree is empty.");
- }else if (x < myTree->element)
- {
- myTree->pLeftChild = Delete(x,myTree->pLeftChild);
- }else if (x > myTree->element)
- {
- myTree->pRightChild = Delete(x,myTree->pRightChild);
- }else if (myTree->pLeftChild && myTree->pRightChild)
- {
- TempCell = FindMin(myTree->pRightChild);
- myTree->element = TempCell->element;
- myTree->pRightChild = Delete(myTree->element,myTree->pRightChild);
- }else
- {
- TempCell = myTree;
- if(myTree->pLeftChild == NULL)
- {
- myTree = myTree->pRightChild;
- }else if (myTree->pRightChild == NULL)
- {
- myTree = myTree->pLeftChild;
- }
- free(TempCell);
- }
- return myTree;
- }
- ptrTreeNode Find(Element_type x,ADTTree myTree)
- {
- if(myTree == NULL)
- {
- printf("\nelement not be found.");
- }else if (x < myTree->element)
- {
- return Find(x,myTree->pLeftChild);
- }else if(x > myTree->element)
- {
- return Find(x,myTree->pRightChild);
- }else
- return myTree;
- }
- void MakeEmpty(ADTTree myTree)
- {
- if(myTree != NULL)
- {
- MakeEmpty(myTree->pLeftChild);
- MakeEmpty(myTree->pRightChild);
- free(myTree);
- }
- return;
- }