冬日飘雪
二叉树
#include
<
iostream
>
using
namespace
std;
struct
_node
{
int
data;
_node
*
left;
_node
*
right;
}
node;
typedef _node T;
class
BinaryTree
{
public
:
BinaryTree()
{root
=
NULL;m_nSize
=
0
;}
~
BinaryTree()
{}
bool
IsEmpty()
{
return
root
==
NULL;}
int
Size()
{
return
m_nSize;}
//
清空
bool
Clear(T
*
root)
{
if
(root
==
NULL)
return
true
;
//
根节点为空
else
{
if
(root
->
left)
{
Clear(root
->
left);
}
if
(root
->
right)
{
Clear(root
->
right);
}
Delete(root
->
data);
}
return
true
;
}
//
插入
bool
Insert(
int
data)
{
if
(root
==
NULL)
{
root
=
new
T();
root
->
data
=
data;
root
->
left
=
NULL;
root
->
right
=
NULL;
m_nSize
++
;
return
true
;
}
else
//
root != NULL
{
T
*
parent
=
NULL;
T
*
temp
=
root;
while
(
true
)
{
if
(temp
->
data
<
data)
{
while
(temp
&&
temp
->
data
<
data)
{
parent
=
temp;
temp
=
temp
->
right;
}
if
(
!
temp)
{
temp
=
new
T();
temp
->
data
=
data;
temp
->
left
=
NULL;
temp
->
right
=
NULL;
parent
->
right
=
temp;
m_nSize
++
;
return
true
;
}
}
else
//
temp->data > data
{
while
(temp
&&
temp
->
data
>
data)
{
parent
=
temp;
temp
=
temp
->
left;
}
if
(
!
temp)
{
temp
=
new
T();
temp
->
data
=
data;
temp
->
left
=
NULL;
temp
->
right
=
NULL;
parent
->
left
=
temp;
m_nSize
++
;
return
true
;
}
}
}
}
}
//
int DeleteC(T* item, int data)
//
{
//
if (item == NULL)
//
{
//
return NULL;
//
}
//
else
//
{
//
int side = 0;
//
if (item->data < data)
//
{
//
side = 1;
//
1 -> right
//
DeleteC(item->right);
//
}
//
else if (item->data > data)
//
{
//
DeleteC(item->left);
//
}
//
else
//
item->data == data
//
{
//
if (Size() == 1)
//
{
//
delete root;
//
root = NULL;
//
m_nSize--;
//
return data;
//
}
//
}
//
}
//
}
//
删除
int
Delete(
int
data)
{
if
(root
==
NULL)
{
return
NULL;
//
NULL
}
else
//
root != NULL
{
T
*
parent
=
root;
T
*
temp
=
root;
int
side
=
0
;
while
(
true
)
{
while
(temp
&&
temp
->
data
<
data)
//
1 -> right
{
parent
=
temp;
temp
=
temp
->
right;
side
=
1
;
}
while
(temp
&&
temp
->
data
>
data)
{
parent
=
temp;
temp
=
temp
->
left;
side
=
2
;
}
if
(
!
temp)
{
return
NULL;
}
if
(temp
->
data
==
data)
{
if
(Size()
==
1
)
{
delete root;
root
=
NULL;
m_nSize
--
;
return
data;
}
if
(
!
temp
->
left
&&
!
temp
->
right)
//
left == NULL && right == NULL
{
if
(side
==
1
)
parent
->
right
=
NULL;
else
parent
->
left
=
NULL;
delete temp;
temp
=
NULL;
m_nSize
--
;
return
data;
}
else
if
(
!
temp
->
left)
//
left == NULL && right != NULL
{
if
(side
==
1
)
{
parent
->
right
=
temp
->
right;
delete temp;
temp
=
NULL;
m_nSize
--
;
return
data;
}
else
{
parent
->
left
=
temp
->
right;
delete temp;
temp
=
NULL;
m_nSize
--
;
return
data;
}
}
else
if
(
!
temp
->
right)
//
left!=NULL && right == NULL
{
if
(side
==
1
)
{
parent
->
right
=
temp
->
left;
delete temp;
temp
=
NULL;
m_nSize
--
;
return
data;
}
else
{
parent
->
left
=
temp
->
left;
delete temp;
temp
=
NULL;
m_nSize
--
;
return
data;
}
}
else
if
(temp
->
left
&&
temp
->
right)
//
left!=NULL && right != NULL
{
T
*
p
=
NULL;
T
*
q
=
NULL;
if
(side
==
1
)
{
p
=
temp
->
left
->
right;
temp
->
left
->
right
=
temp
->
right;
parent
->
right
=
temp
->
left;
q
=
temp
->
right;
while
(q
->
left)
{
q
=
q
->
left;
}
//
q->left == NULL
q
->
left
=
p;
delete temp;
temp
=
NULL;
m_nSize
--
;
return
data;
}
else
//
side == 2
{
p
=
temp
->
left
->
right;
temp
->
left
->
right
=
temp
->
right;
parent
->
left
=
temp
->
left;
q
=
temp
->
right;
while
(q
->
left)
{
q
=
q
->
left;
}
q
->
left
=
p;
delete temp;
temp
=
NULL;
m_nSize
--
;
return
data;
}
}
}
}
}
}
T
*
GetRoot()
{
return
root;
}
bool
Show(T
*
root)
{
if
(root
==
NULL)
{
return
true
;
}
if
(root
->
left)
{
Show(root
->
left);
}
cout
<<
root
->
data
<<
"
"
;
if
(root
->
right)
{
Show(root
->
right);
}
return
true
;
}
private
:
T
*
root;
//
根节点
int
m_nSize;
//
节点数
}
;
posted on 2010-08-05 13:09
Bomb
阅读(196)
评论(0)
编辑
收藏
引用
所属分类:
C++
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
MFC非模态对话框的销毁(转)
二叉树
0/1背包——非递归解法
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理
My Links
C++博客
首页
新随笔
联系
聚合
管理
Blog Stats
随笔 - 9
文章 - 0
评论 - 0
Trackbacks - 0
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
给我留言
查看公开留言
查看私人留言
随笔分类
C++(3)
(rss)
DataBase(3)
(rss)
MultiThread(1)
(rss)
随笔档案
2010年8月 (5)
2010年5月 (3)
2010年4月 (1)
搜索
最新评论
阅读排行榜
1. MFC非模态对话框的销毁(转)(532)
2. ADO智能指针(转)(506)
3. SQL Server字符集的研究(转)(430)
4. 如何利用UDL文件来建立ADO连接(转)(400)
5. 跳动的字符_多线程(263)
评论排行榜
1. 跳动的字符_多线程(0)
2. 浅析C++中的this指针(0)
3. 明确C++风格的类型转换的用法(0)
4. 0/1背包——非递归解法(0)
5. SQL Server字符集的研究(转)(0)
Powered by:
C++博客
Copyright © Bomb