树的基本操作代码 c语言,树的基本操作(C语言)

#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);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值