#include
<
cstdio
>
#include
<
cstdlib
>
#include
<
queue
>
#include
<
algorithm
>
using
namespace
std;
typedef
struct
_btree
{
int
data;
struct
_btree
*
left;
struct
_btree
*
right;
}btree,
*
ptree;
ptree BuildTree(
int
data[]);
void
PrintTree(ptree ptr);
void
CountLeaf(ptree ptr,
int
&
count);
void
leaveorderoutput(ptree ptr);
int
depth(ptree ptr);
void
countElem(ptree ptr,
int
&
elem);
ptree copyTree(ptree ptr);
void
DeleteTree(ptree ptr);
int
main(
void
)
{
int
array[
10
];
int
count
=
0
;
int
countelem
=
0
;
for
(
int
i
=
0
;i
<
10
;i
++
)
{
array[i]
=
rand()
%
10
;
}
for
(
int
i
=
0
;i
<
10
;i
++
)
{
printf(
"
%d
"
,array[i]);
}
printf(
"
\n
"
);
ptree root
=
BuildTree(array);
PrintTree(root);
printf(
"
\n
"
);
CountLeaf(root,count);
printf(
"
CountLeaf:%d\n
"
,count);
leaveorderoutput(root);
printf(
"
\n
"
);
int
depthval
=
depth(root);
printf(
"
depth:%d\n
"
,depthval);
countElem(root,countelem);
printf(
"
count elem:%d\n
"
,countelem);
ptree root2
=
copyTree(root);
PrintTree(root2);
printf(
"
\n
"
);
DeleteTree(root);
DeleteTree(root2);
}
ptree BuildTree(
int
data[])
{
ptree root
=
NULL;
int
i
=
0
;
root
=
(ptree)malloc(
sizeof
(btree));
root
->
data
=
data[i
++
];
root
->
left
=
NULL;
root
->
right
=
NULL;
ptree ptr
=
root,pre;
while
(i
!=
10
)
{
ptr
=
root;
while
(ptr
!=
NULL)
{
pre
=
ptr;
if
(data[i]
>
ptr
->
data)
{
ptr
=
ptr
->
left;
}
else
{
ptr
=
ptr
->
right;
}
}
ptr
=
(ptree)malloc(
sizeof
(btree));
ptr
->
data
=
data[i
++
];
ptr
->
left
=
NULL;
ptr
->
right
=
NULL;
if
(ptr
->
data
>
pre
->
data)
{
pre
->
left
=
ptr;
}
else
{
pre
->
right
=
ptr;
}
}
return
root;
}
void
PrintTree(ptree ptr)
{
if
(ptr
!=
NULL)
{
PrintTree(ptr
->
left);
printf(
"
%d
"
,ptr
->
data);
//
PrintTree(ptr->left);
PrintTree(ptr
->
right);
}
}
void
CountLeaf(ptree ptr,
int
&
count)
{
if
(ptr
!=
NULL)
{
if
(ptr
->
left
==
NULL
&&
ptr
->
right
==
NULL)
{
++
count;
}
CountLeaf(ptr
->
left,count);
CountLeaf(ptr
->
right,count);
}
}
void
leaveorderoutput(ptree ptr)
//
显示每层元素
{
queue
<
ptree
>
q;
ptree p;
q.push(ptr);
while
(
!
q.empty())
{
p
=
q.front();
q.pop();
printf(
"
%d
"
,p
->
data);
if
(p
->
left
!=
NULL)
{
q.push(p
->
left);
}
if
(p
->
right
!=
NULL)
{
q.push(p
->
right);
}
}
}
int
depth(ptree ptr)
{
int
depthLeft,depthRight,depthval;
if
(ptr
==
NULL)
{
depthval
=-
1
;
}
else
{
depthLeft
=
depth(ptr
->
left);
depthRight
=
depth(ptr
->
right);
depthval
=
1
+
(depthLeft
>
depthRight
?
depthLeft:depthRight);
}
return
depthval;
}
void
countElem(ptree ptr,
int
&
elem)
{
if
(ptr
!=
NULL)
{
++
elem;
countElem(ptr
->
left,elem);
countElem(ptr
->
right,elem);
}
}
ptree copyTree(ptree ptr)
{
ptree newLeft,newRight,newNode;
if
(ptr
==
NULL)
{
return
NULL;
}
newLeft
=
copyTree(ptr
->
left);
newRight
=
copyTree(ptr
->
right);
newNode
=
(ptree)malloc(
sizeof
(btree));
newNode
->
data
=
ptr
->
data;
newNode
->
left
=
newLeft;
newNode
->
right
=
newRight;
return
newNode;
}
void
DeleteTree(ptree ptr)
{
if
(ptr
!=
NULL)
{
DeleteTree(ptr
->
left);
DeleteTree(ptr
->
right);
free(ptr);
}
}