#include <iostream> #include <string> using namespace std; typedef struct BiTNode { int data; int flag; BiTNode *lchild,*rchild; } BTNode,BTree; //二叉排序樹的查找非遞歸算法 //在二叉排序樹T中查找關鍵字爲key的元素,若找到返回true, //不然返回false. bool SearchBST(BTree *T,int key) { BTree *p = T; while(p) { if(p->data == key) { return true; } p = (key < p->data) ? p->lchild:p->rchild; } return false; } //二叉排序樹的查找遞歸算法 //在二叉排序樹T中查找關鍵字爲key的元素,若找到返回true, //不然返回false. bool SearchBST2(BTree *T,int key) { BTree *p=T; if(p == NULL) { return false; } else if(p->data == key) { return true; } else if(key > p->data) { return SearchBST2(p->rchild, key); } else { return SearchBST2(p->lchild, key); } } //創建二叉排序樹 //當二叉排序樹T中不存在關鍵字爲key的元素時,插入key,並返回樹的根, //不然不插入,並返回樹的根。 BTree* InsertBST(BTree *T,int key) { BTree *f=T,*p=T; while(p != NULL) { if(p->data == key) { return T; } f = p; //用f記下查找路徑上的最後一個訪問的節點 p = (key < p->data)? p->lchild:p->rchild; } p = new BTNode(); p->data = key; p->lchild = p->rchild = NULL; if(T == NULL) { T = p; } else if(key < f->data) { f->lchild = p; } else { f->rchild = p; } return T; } //遞歸中序遍歷 void InOrderDisplay(BTree *T) { if(T != NULL) { InOrderDisplay(T->lchild); cout<<T->data<<","; InOrderDisplay(T->rchild); } } //test: int main() { BTree *tree = NULL; string strNode = ""; int nNode = 0; cout<<"請輸入數字,esc結束"<<endl; while(true) { cin>>strNode; if(strNode == "esc" || strNode == "ESC") { break; } nNode = atoi(strNode.c_str()); if(nNode >= 0) { tree = InsertBST(tree,nNode); } } InOrderDisplay(tree); //SearchBST2(tree,24); return 0; }