BinarySortTreeADT.h<br />/*<br />*二叉排序樹(Binary Sort Tree)又稱二叉尋找(搜尋)樹(Binary Search Tree)。<br />*其定義為:二叉排序樹或者是空樹,或者是滿足如下性質的二叉樹:<br />*①若它的左子樹非空,則左子樹上所有結點的值均小於根結點的值;<br />*②若它的右子樹非空,則右子樹上所有結點的值均大於根結點的值;<br />*③左、右子樹本身又各是一棵二叉排序樹。<br />*上述性質簡稱二叉排序樹性質(BST性質),故二叉排序樹實際上是滿足BST性質的二叉樹。<br />*/<br />#ifndef _BINARYSORTTREEADT_H<br />#define _BINARYSORTTREEADT_H</p><p>/* 聲明結點的值的類型 */<br />typedef int KeyType;</p><p>/* 聲明結點類型 */<br />typedef struct CBSTNode<br />{<br /> KeyType m_ktKey;<br /> struct CBSTNode * m_pCBSTNLeft;<br /> struct CBSTNode * m_pCBSTNRight;<br />}CBSTNode, *PCBSTNode, *CBSTree;</p><p>/* 向二叉排序樹中加入一個結點 */<br />extern int InsertNode(CBSTree *, KeyType);</p><p>/* 通過值尋找並刪除一個結點 */<br />extern int DelNode(CBSTree *, KeyType);</p><p>/* 通過值尋找結點並返回結點的指標(設為常量指標) */<br />extern const CBSTNode * SearchNode(CBSTree *, KeyType);</p><p>/* 中序遍曆二叉排序樹的結點 */<br />extern void PrintAllNodeMid(CBSTree);</p><p>/* 後序方式釋放結點 */<br />extern void FreeBSTree(CBSTree);<br />#endif</p><p>BinarySortTreeADT.cpp<br />#include "BinarySortTreeADT.h"<br />#include <stdlib.h><br />#include <stdio.h></p><p>/* 向二叉排序樹中加入一個結點 */<br />int InsertNode(CBSTree * tree, KeyType key)<br />{<br /> PCBSTNode p = NULL, parent = NULL;<br /> PCBSTNode pNewNode = (PCBSTNode)malloc(sizeof(CBSTNode));<br /> if (NULL == pNewNode)<br /> {<br /> return -1;<br /> }<br /> /* 建立結點賦值,特別是左右子結點指標要賦值為NULL */<br /> pNewNode->m_ktKey = key;<br /> pNewNode->m_pCBSTNLeft = NULL;<br /> pNewNode->m_pCBSTNRight = NULL;<br /> /* 二叉排序樹是空樹 */<br /> if (NULL == *tree)<br /> {<br /> *tree = pNewNode;<br /> return 0;<br /> }<br /> else<br /> {<br /> p = *tree;<br /> /* 尋找插入位置 */<br /> while (NULL != p)<br /> {<br /> /* key值已在二叉排序樹中 */<br /> if (p->m_ktKey == key)<br /> {<br /> return 0;<br /> }<br /> else<br /> {<br /> parent = p;<br /> p = (p->m_ktKey < key) ? p->m_pCBSTNRight : p->m_pCBSTNLeft;<br /> }<br /> }<br /> if (parent->m_ktKey < key)<br /> {<br /> parent->m_pCBSTNRight = pNewNode;<br /> }<br /> else<br /> {<br /> parent->m_pCBSTNLeft = pNewNode;<br /> }<br /> return 0;<br /> }<br />}</p><p>/* 通過值尋找並刪除一個結點 */<br />int DelNode(CBSTree * tree, KeyType key)<br />{<br /> PCBSTNode p = NULL, q = NULL, parent = NULL, child = NULL;<br /> p = *tree;<br /> /* parent為NULL表示根結點的父親為NULL */<br /> while (NULL != p)<br /> {<br /> if (p->m_ktKey == key)<br /> {<br /> break;<br /> }<br /> else<br /> { parent = p;<br /> p = (p->m_ktKey < key) ? p->m_pCBSTNRight : p->m_pCBSTNLeft;<br /> }<br /> }<br /> /* p為NULL時, 表示沒有找到結點值為key的結點 */<br /> if (NULL == p)<br /> {<br /> return 0;<br /> }<br /> /* p, q現在都是儲存了待刪結點指標 */<br /> q = p;</p><p> /* 待刪結點有兩個兒子結點,進行一下轉化 */<br /> if (NULL != p->m_pCBSTNLeft && NULL != p->m_pCBSTNRight)<br /> {<br /> parent = p;<br /> p = p->m_pCBSTNRight;<br /> while (NULL != p->m_pCBSTNLeft)<br /> {<br /> parent = p;<br /> p = p->m_pCBSTNLeft;<br /> }<br /> /* p中儲存了待刪結點右子樹中最左下的結點指標, parent中就儲存了該結點父親指標 */<br /> child = p->m_pCBSTNRight;<br /> }</p><p> /* parent儲存待刪結點的父親結點指標, child儲存了待刪結點的兒子結點<br /> 指標(待刪結點至多隻有一個兒子, 有兩個會轉化為0個或1個右結點)*/</p><p> /* 待刪結點是根結點 */<br /> if (NULL == parent)<br /> {<br /> *tree = child;<br /> }<br /> else<br /> {<br /> /*待刪結點是父親結點的左兒子*/<br /> if (parent->m_pCBSTNLeft == p)<br /> {<br /> parent->m_pCBSTNLeft = child;<br /> }<br /> else<br /> {<br /> parent->m_pCBSTNRight = child;<br /> }<br /> /*待刪結點有兩個兒子結點, 轉化後需要交換兩個結點值 */<br /> if (p != q)<br /> {<br /> q->m_ktKey = p->m_ktKey;<br /> }<br /> }<br /> free(p);<br /> return 0;<br />}</p><p>/* 通過值尋找結點並返回結點的指標(設為常量指標) */<br />const CBSTNode * SearchNode(CBSTree * tree, KeyType key)<br />{<br /> PCBSTNode p = *tree;<br /> while (NULL != p)<br /> {<br /> if (p->m_ktKey == key)<br /> {<br /> break;<br /> }<br /> else<br /> {<br /> p = (p->m_ktKey < key) ? p->m_pCBSTNRight : p->m_pCBSTNLeft;<br /> }<br /> }<br /> return p;<br />}</p><p>/* 中序遍曆二叉排序樹的結點 */<br />void PrintAllNodeMid(CBSTree tree)<br />{<br /> if (NULL != tree)<br /> {<br /> PrintAllNodeMid(tree->m_pCBSTNLeft);<br /> printf("%d is accessed./n", tree->m_ktKey);<br /> PrintAllNodeMid(tree->m_pCBSTNRight);<br /> }<br />}</p><p>/* 後序方式釋放結點 */<br />void FreeBSTree(CBSTree tree)<br />{<br /> if (NULL != tree)<br /> {<br /> FreeBSTree(tree->m_pCBSTNLeft);<br /> FreeBSTree(tree->m_pCBSTNRight);<br /> printf("%d is free./n", tree->m_ktKey);<br /> free(tree);<br /> }<br />}<br />
2009-03-06
11:31:42
深圳