二叉排序树,在各种面试中都要考察,算法数据结构考察的重点。今天照着教科书的程序打了一通,发现它运行达不到预想的效果(中序遍历为空),调试后发现其在Insert出错,没有能够将值插入二叉树,但保存了值到ST=new Node[maxSize];的ST中,ST用于顺序保存输入的数据。
删除时 : 12
5 54
18 64
14 25
20
当要删除54时,(q!=p,有移动,那么直接将q->rchild=s->lchild),
p->lchild,p->rchild 都为真
p->>54,q->>54,s->>18
q->>18, s->>25,
将25替换54,p->data=s->data
18的右节点指向20,q->rchild =s->lchild;
删除当前25节点,delete s;
没15、20:12
5 54
18 64
14
要删除54,(q==p,没有移动,那么直接将q->lchild=s->lchild)
p->lchild,p->rchild 都为真
p->>54,q->>54,s->>18
要删除54,p->data=s->data;
q->lchild=s->lchild
delete s;
#ifndef _BSTSEARCH_H #define _BSTSEARCH_H typedef int T; #define maxSize 100 #define FALSE -1 #define TRUE 0 template struct Node { T key; /* */ }; template struct bitree { Node data; bitree *lchild; bitree *rchild; }; template class BSTree { public: Node *ST; //顺序存储 int len; bitree *t; //根指针 bitree *f; //根指针的双亲指针 bitree *p; //指向查找路径上最后访问的节点 BSTree(); ~BSTree(); void SearchBST(bitree *t, T key); void InsertBST(bitree *(&t),Node e); int DeleteBST(bitree * (&t),T key); //查找二叉排序树中data为Key的节点 int Delete(bitree *(&p)); //删除指定的节点 void DeleteElem(T key); //删除输入为Key的记录 void InDisplay(bitree *t); //中序遍历二叉排序树 void Display(); }; #endif
#######################
// BSTSearch.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include #include "BSTSearch.h" using namespace std; template BSTree::BSTree() { ST=new Node[maxSize]; len=0; t=NULL; } template BSTree::~BSTree() { delete []ST; len=0; delete t; cout<<"成功销毁/n"; } template void BSTree::SearchBST(bitree *t, T key) { if(t==NULL||key==t->data.key) { if(key==t->data.key) cout<<"找到"<<<"的节点"< else cout<<"不存在"<<<"的节点"< } else if(keydata.key) SearchBST(t->lchild,key); else SearchBST(t->rchild,key); } template void BSTree::InsertBST(bitree * (&t),Node e) { ST[len]=e; len++; p=t; while(p) //这样写在插入最初节点时,容易出错。最初节点为t==NULL,while(p)为假,退出。这个教科书上错了~~哈哈 { if(p->data.key==e.key) { cout<<"二叉排序树中已存在值为:"<<<"的节点"< exit(1); } f=p; if(e.keydata.key) p=p->lchild; else p=p->rchild; } //zz:改成在这就可以了。每次寻找 p=new bitree; p->data=e; p->lchild=p->rchild=NULL; if(t==NULL) t=p; else { if(e.keydata.key) f->lchild=p; else f->rchild=p; } // }书本中的while的}在这 } template int BSTree::DeleteBST(bitree *(&t),T key) { if(!t) { cout<<"二叉树为空,无法删除/n"; return FALSE; } else { if(key==t->data.key) return Delete(t); else if(keydata.key) return DeleteBST(t->lchild,key); else return DeleteBST(t->rchild,key); } } template int BSTree::Delete(bitree * (&p)) { bitree *q,*s; if(!p->rchild) //无右子树 { q=p; p=p->lchild; delete q; cout<<"成功删除"< } else if(!p->lchild) //无左子树 { q=p; p=p->rchild; delete q; cout<<"Delete Success"< } else { q=p; s=p->lchild; while(s->rchild) { q=s; s=s->rchild; } p->data=s->data; if(q!=p) q->rchild=s->lchild; else q->lchild=s->lchild; delete s; cout<<"delete success"< } return TRUE; } template void BSTree::DeleteElem(T key) { int i; for(i=0;i if(i { for(int j=i+1;j ST[i]=ST[j]; len--; } } template void BSTree::InDisplay(bitree*t) //递归中序遍历 { if(t!=NULL) { InDisplay(t->lchild); cout<data.key<<" "; InDisplay(t->rchild); } } template void BSTree::Display() { cout<<"查找表中的数据元素关键字依次为:/n"; for(int i=0;i cout<<<" "; cout< } int _tmain(int argc, _TCHAR* argv[]) { int m,l,i; BSTree a; do { cout<<"---------------二叉排序树的基本操作-----------"< cout<<"-----1.创建查找表-----------------------------/n" <<"-----2.插入元素-----------------------------/n" <<"-----3.删除元素-----------------------------/n" <<"-----4.查找元素-----------------------------/n" <<"-----5.中序遍历输出-----------------------------/n" <<"-----6.输出----------------------------/n" <<"-----7.退出-----------------------------/n" <<"请选择/n"; cin>>m; Node e; T key; switch(m) { case 1: cout<<"输入要插入的数据元素个数/n"; cin>>l; cout<<"输入"<<<"个不同的数据元素/n"; for(i=0;i { cin>>e.key; a.InsertBST(a.t,e); } break; case 2: // Node e; cout<<"输入要插入的数据元素/n"; cin>>e.key; a.InsertBST(a.t,e); break; case 3: cout<<"输入要删除的数据元素:"; cin>>key; a.DeleteBST(a.t,key); a.DeleteElem(key); break; case 4: // T key; cout<<"输入查找的数据元素:"; cin>>key ; a.SearchBST(a.t,key); break; case 5: cout<<"中序遍历结果:"< a.InDisplay(a.t); cout< break; case 6: cout<<"二叉树输出:"< a.Display(); cout< break; case 7: cout<<"结束运行!"< break; } }while(m!=7); return 0; }
二叉排序树操作详解
本文详细介绍了二叉排序树的基本操作实现,包括创建、插入、删除、查找及遍历等核心功能,并通过具体示例代码展示了每个步骤的细节。
2689

被折叠的 条评论
为什么被折叠?



