二叉树的实现

#include <iostream>
#include <queue>
using namespace std;
typedef int ElemType;
typedef struct BiTreeNode{
ElemType data;
struct BiTreeNode *lchild,*rchild;
}*BiTree,*BiNodePtr,BiNode;
typedef void (*visit)(BiNodePtr node);

void preOrderCreateTree(BiTree *T)
{
BiNodePtr node;ElemType data;
cin>>data;
if(data==0){*T=NULL;return;}
*T=new BiNode;
(*T)->data=data;
preOrderCreateTree(&((*T)->lchild));
preOrderCreateTree(&((*T)->rchild));
}
void destroyTree(BiTree *T)
{
BiTree t=*T;
if(!t)return;
destroyTree(&(t->lchild));
destroyTree(&(t->rchild));
delete t;
*T=NULL;
}
BiNodePtr parent(BiTree T,BiNodePtr child)
{
BiNodePtr ptr=NULL;
if(!T||!(T->lchild||T->rchild)||!child)return NULL;
if(T->lchild==child||T->rchild==child)return T;
ptr=parent(T->lchild,child);
if(ptr)return ptr;
ptr=parent(T->rchild,child);
return ptr;
}
int depth(BiTree T)
{
if(!T)return 0;
else
{
return depth(T->lchild)>depth(T->rchild)?depth(T->lchild)+1:depth(T->rchild)+1;
}
}
bool empty(BiTree T)
{return T==NULL;}
int leafNum(BiTree T)
{
if(!T)return 0;
if(!(T->lchild || T->rchild))return 1;
else return leafNum(T->lchild)+leafNum(T->rchild);
}
BiNodePtr search(BiTree T,ElemType e)
{
BiNodePtr p;
if(!T)return NULL;
if(T->data==e)return T;
p=search(T->lchild,e);
if(p)return p;
p=search(T->rchild,e);
return p;
}
void levelTraverse(BiTree T,visit func)
{
queue<BiNodePtr> que;
BiNodePtr ptr;
if(T)que.push(T);
while(!que.empty()){
ptr=que.front();
que.pop();
func(ptr);
if(ptr){
que.push(ptr->lchild);
que.push(ptr->rchild);
}
}
}
void preOrderTraverse(BiTree T,visit func){
if(!T)return;
func(T);
preOrderTraverse(T->lchild,func);
preOrderTraverse(T->rchild,func);
}
void inOrderTraverse(BiTree T,visit func){
if(!T)return;
inOrderTraverse(T->lchild,func);
func(T);
inOrderTraverse(T->rchild,func);
}
void postOrderTraverse(BiTree T,visit func)
{
if(!T)return;
postOrderTraverse(T->lchild,func);
postOrderTraverse(T->rchild,func);
func(T);
}
BiTree insertChild(BiTree T,BiNodePtr parent,int which,BiTree child)
{
BiNodePtr ptr=NULL;
if(!T||!parent)return NULL;
if(which){ptr=parent->rchild;parent->rchild=child;return ptr;}
else{ptr=parent->lchild;parent->lchild=child;return ptr;}
}
void deleteChild(BiTree T,BiTree child)
{
BiNodePtr par=parent(T,child);
if(!par)return;
if(par->lchild==child){par->lchild=NULL;destroyTree(&(par->lchild));}
else{par->rchild=NULL;destroyTree(&(par->rchild));}
}
void print(BiNodePtr node)
{
if(NULL == node) return;
cout<<node->data<<' ';
}
int main(int argc,char *argv[])
{
BiTree tree=NULL;
preOrderCreateTree(&tree);
cout<<"tree depth:"<<depth(tree)<<"leaf num:"<<leafNum(tree)<<endl;
cout<<"parent of 3:"<<parent(tree,search(tree,3))->data<<endl;
preOrderTraverse(tree,print);
cout<<endl;
inOrderTraverse(tree,print);
cout<<endl;
postOrderTraverse(tree,print);
cout<<endl;
levelTraverse(tree,print);
cout<<endl;
destroyTree(&tree);
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值