首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C++ 写的二叉排序树,大家交流,该如何解决

2012-02-11 
C++ 写的二叉排序树,大家交流*****************btree.h**************#ifndef_BTREE_H_#define_BTREE_H_#i

C++ 写的二叉排序树,大家交流
*****************btree.h**************
#ifndef   _BTREE_H_
#define   _BTREE_H_

#include   <iostream>
using   namespace   std;

class   Node
{
public:
Node();
int   iKey;
Node   *pLChild;
Node   *pRChild;

};

class   BTree
{

public:
BTree();
~BTree();
Node   *InsertTree(int   iKey);
Node   *   SearchTree(int   iKey);
Node   *   DeleteTree(int   iKey);
void   DestroyTree();
void   ShowTree();

private:
Node   *Search(Node   *pNode,   int   iKey);
Node   *Insert(Node*   pHead,     int   iKey);
Node   *   Delete(Node   *pHead,   int   iKey);
void   Destroy(Node   *pHead);
void   Show(Node   *pHead);
public:
Node   *m_pRoot;
};

*****************btree.cpp**************
#include   "btree.h "

#define   _MAIN_

Node::Node()
{
iKey   =0;
pLChild   =   NULL;
pRChild   =   NULL;
}

BTree::BTree()
{
m_pRoot   =   NULL;
}

BTree::~BTree()
{
DestroyTree();
}


Node   *BTree::Insert(Node*   pHead,     int   iKey)
{

if   (pHead   ==   NULL)
{
Node   *   pNow   =   new   Node();
pNow-> iKey   =   iKey;
pNow-> pLChild   =   pNow-> pRChild   =   NULL;
return   pNow;
}

if   (iKey   <pHead-> iKey)
{
pHead-> pLChild   =   Insert(pHead-> pLChild,   iKey);
}
else
{
pHead-> pRChild   =   Insert(pHead-> pRChild,iKey);
}

return   pHead;
}


Node   *BTree::Search(Node   *pNode,   int   iKey)
{
if   (pNode   ==   NULL)   return   NULL;

if   (iKey   ==   pNode-> iKey)
{
return   pNode;
}
else   if   (iKey   <   pNode-> iKey)
{
return   Search(pNode-> pLChild,   iKey);
}
else  
{
return   Search(pNode-> pRChild,   iKey);
}
}

void   BTree::Show(Node   *pHead)
{
//cout   < <   "debug   ............begin   show   pHead= "   < <   pHead   < <   endl;
if   (pHead   !=   NULL)
{
Show(pHead-> pLChild);
cout   < <   pHead-> iKey   < <   "   ";
Show(pHead-> pRChild);
}
}

Node   *   BTree::Delete(Node   *pHead,   int   iKey)
{
Node   *p,   *q;

if   (pHead-> iKey   ==   iKey)
{
if   (pHead-> pLChild   ==NULL   &&pHead-> pRChild   ==NULL)
{
delete   pHead;
return   NULL;
}
else   if   (pHead-> pLChild   ==   NULL)
{
p   =   pHead-> pRChild;
delete   pHead;
return   p;  
}
else   if   (pHead-> pRChild   ==   NULL)
{
p   =   pHead-> pLChild;


delete   pHead;
return   p;
}
else
{
p   =   q   =   pHead-> pRChild;
while   (p-> pLChild   !=   NULL)
{
//找到左子树最左孩子结点
p   =   p-> pLChild;
}
//原左子树作为左孩子
p-> pLChild   =   pHead-> pLChild;
delete   pHead;
return   q;
}
}

if(pHead-> iKey   > iKey   &&pHead-> pLChild   !=NULL)
{
pHead-> pLChild   =   Delete(pHead-> pLChild,   iKey);
}
if(pHead-> iKey   <iKey   &&pHead-> pRChild   !=NULL)
{
pHead-> pRChild   =   Delete(pHead-> pRChild,   iKey);
}
return   pHead;
}

void   BTree::Destroy(Node   *   pHead)
{
if   (pHead!=NULL)
{
Destroy(pHead-> pLChild);
Destroy(pHead-> pRChild);
delete   pHead;
}

}

Node   *   BTree::SearchTree(int   iKey)
{
return   Search(m_pRoot,   iKey);

}


Node   *BTree::InsertTree(int   iKey)
{
m_pRoot   =   Insert(m_pRoot,   iKey);
}


Node   *   BTree::DeleteTree(int   iKey)
{
return   Delete(m_pRoot,iKey);
}

void   BTree::DestroyTree()
{
Destroy(m_pRoot);
}
void   BTree::ShowTree()
{
Show(m_pRoot);

}

#ifdef   _MAIN_

int   main()
{
BTree   *pBTree   =   new   BTree();


pBTree-> InsertTree(6);
pBTree-> InsertTree(4);
pBTree-> InsertTree(9);
pBTree-> InsertTree(8);
pBTree-> InsertTree(7);
pBTree-> InsertTree(3);
pBTree-> InsertTree(5);
pBTree-> InsertTree(10);

cout   < <   "root: "   < <   pBTree-> m_pRoot   < <   endl;
pBTree-> ShowTree();
cout   < <   endl;
Node   *pNode   =   pBTree-> SearchTree(3);
if   (pNode   !=   NULL)
{
cout   < <   "search   key   =   "   < <   pNode-> iKey   < <   "ok "   < <   endl;
}

pBTree-> DeleteTree(4);
cout   < <   "after   delete   4   " < <   endl;
pBTree-> ShowTree();
pBTree-> DeleteTree(7);
cout   < <   "after   delete   7   " < <   endl;
pBTree-> ShowTree();

delete   pBTree;
return   0;

}


#endif



[解决办法]
要学造轮子,就去看《STL源码剖析》
另外,在string都不用的单位,实在没前途,不如早作打算吧。

热点排行