二叉排序树的实现作业
#include<iostream>
using namespace std;
typedef int KeyType ;
typedef struct node
{
KeyType key;//关键字
struct node* rchild,*lchild;
}BSTNode;
1. 编写SearchBST(T, key)与InsertBST(T, key)的伪代码,并实现;
1.SearchBST伪代码: //void SearchBST(T, key) //{ //if (T为空 || T->key == key) //{ //return T; //} //else //{ //if(T->key < key) //return SearchBST(T->lchild,key); //else //return SearchBST(T->rchild, key); //} // }
查找二叉排序树代码: BSTNode* SearchBST(BSTNode*T, KeyType key) { if (T==NULL || T->key == key) { return T; } else { if(T->key>key) return SearchBST(T->lchild,key); else return SearchBST(T->rchild, key); } }
InsertBST(T, key)的伪代码: // InsertBST(T, key) //{ // if (T为空) // { // 插入新结点; // } // else if(key ==T->key) // return false; // else if (T->key > key) // { // InsertBST(T->lchild, key); // } // else // { // InsertBST(T->rchild, key); // } //} InsertBST代码: bool InsertBST(BSTNode*&T,KeyType key) { if (T == NULL) { T = new BSTNode; T->key = key; T->lchild = T->rchild = NULL; } else if (T->key == key) return false; else if (T->key > key) { return InsertBST(T->lchild, key); } else { return InsertBST(T->rchild, key); } }
2. 编写CreateBST(T)的伪代码实现从控制台输入创建BST树。最后使用代码实现。使用“50 30 80 20 40 90 10 25 35 85 23 88”创建BST,并中序输出该BST:
CreateBST(T)的伪代码: CreateBST(T) //{ // int n,i=0; // KeyType a[100]; // cin >> n; // // while (i < n) // { // cin >> a[i]; // InsertBST(T,a[i]); // i++; // } // return T; //}
创建二叉排序树代码: BSTNode* CreateBST(BSTNode* T) { int n,i=0; KeyType a[100]; cin >> n; while (i < n) { cin >> a[i]; InsertBST(T,a[i]); i++; } return T; }
#include<iostream> using namespace std; typedef int KeyType ; typedef struct node { KeyType key;//关键字 struct node* rchild,*lchild; }BSTNode; void InOrder(BSTNode* T); bool InsertBST(BSTNode*& T, KeyType key); BSTNode* CreateBST(BSTNode* &T); int main() { BSTNode *T=NULL; CreateBST(T); InOrder(T); } void InOrder(BSTNode* T) { if (T != NULL) { InOrder(T->lchild); cout << T->key<<' '; InOrder(T->rchild); } } bool InsertBST(BSTNode*&T,KeyType key) { if (T == NULL) { T = new BSTNode; T->key = key; T->lchild = T->rchild = NULL; return true; } else if (T->key == key) return false; else if (T->key > key) { return InsertBST(T->lchild, key); } else { return InsertBST(T->rchild, key); } } BSTNode* CreateBST(BSTNode* &T) { int n,i=0; KeyType a[100]; cin >> n; while (i < n) { cin >> a[i]; InsertBST(T,a[i]); i++; } return T; }
3. 编写DeleteBST(T, key)的伪代码实现从T中删除关键字key。如果无法编写出来,请写出在BST中删除关键字key所需注意的事项:
//bool DeleteBST(BSTNode*& T, KeyType key) //{ // if (T不空) // { // if (T->key == key) // { // Delete (T); // return true; // } // else if (T->key > key) // { // DeleteBST(T->lchild, key); // } // else // DeleteBST(T->rchild, key); // } // else // return false; //} //void Delete(BSTNode*& p) //{ // BSTNode* q; // if (p没有右子树) // { // q = p; // p = p->lchild; // delete q; // } // else if (p没有左子树) // { // q = p; // p = p->rchild; // delete q; // } // else Deletel(p, p->lchild); //} //void Deletel(BSTNode* p, BSTNode*& r) //{ // BSTNode* q; // if (r->rchild != NULL) // 找最右下结点 // else // { // p->key = r->key; // q = r; // r = r->lchild; // delete q; // } //}
4. 选做:使用代码实现DeleteBST(T, key):
bool DeleteBST(BSTNode*& T, KeyType key) { if (T != NULL) { if (T->key == key) { Delete (T); return true; } else if (T->key > key) { DeleteBST(T->lchild, key); } else DeleteBST(T->rchild, key); } else return false; } void Delete(BSTNode*& p) { BSTNode* q; if (p->rchild == NULL) { q = p; p = p->lchild; delete q; } else if (p->lchild == NULL) { q = p; p = p->rchild; delete q; } else Deletel(p, p->lchild); } void Deletel(BSTNode* p, BSTNode*& r) { BSTNode* q; if (r->rchild != NULL) Deletel(p, r->rchild); else { p->key = r->key; q = r; r = r->lchild; delete q; } }