标签:
一、定义数据类型:
//二叉树节点
typedef struct BiTNode
{
char data;
struct BiTNode * lchild,*rchild;
} BiTNode,*BiTree;
//栈节点
typedef struct Stack
{
BiTNode a[NUM]; 定长顺序存储
int top;
}
//队列节点
typedef struct Queue
{
BiTNode a[NUM]; 定长顺序存储
int front;
int rear;
}
二、基本操作:
创建二叉树
1.先序创建二叉树
void CreateBiTree(BiTree &T){
char ch;
ch=getchar();
if(ch==‘‘) T=NULL;
else{
if(!T=(BiTree)malloc(sizeof(BiTNode))) reutrn ERROR;
T->data=ch;
CreateBitree(T->lchild);
CreateBitree(T->rchild);
}
return OK;
}
2.层次创建二叉树,用队列辅助:
void CreateBitree(BiTree &T){
char ch;
BiTree p,q;
Queue Lqueue;
ch=getchar();
if(ch==‘ ‘) T=NULL;
else{
T=(BiTree)malloc(sizeof(BiTNode));
T->data=ch;
Enqueue(Lqueue,T);
while(!emptyLqueue(Lqueue)){
Dequeue(Lqueue,p);
ch=getchar();
if(ch=‘ ‘){
p->lchild=NUll;
}
else{
q=(Bitree)malloc(sizeof(BiTNode));
q->data=ch;
p->lchild=q;
Enqueue(Lqueue,q);
}
ch=getchar();
if(ch=‘ ‘){
p->child=NULL;
}
else{
q=(BiTree)malloc(sizeof(BiTNode));
q->data=ch;
p->rchild=q;
Enqueue(Lqueue,q);
}
}
}
return OK;
}
---------------------------------------------------------------------------------------------------
二叉树的遍历
1.递归遍历
//先序遍历
void PreOrderTraverse(BiTree &T){
if(T){
visit(T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
return OK;
}
//中序遍历
void InOrderTraverse(BiTree &T){
if(T){
InOrderTraverse(T->lchild);
visit(T->data);
InOrderTraverse(T->lchild);
}
return OK;
}
//后序遍历
void PostOrderTraverse(BiTree &T){
if(T){
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
visit(T->data);
}
}
2.非递归遍历,用栈辅助。
算法思想:把根节点及所有做孩子依次压入栈,再依次取出把其右孩子压入栈,再依次探查其左右孩子
//先序遍历
void PreOrderTraver(BiTree &T){
Stack S;
IniyStack(S);
BiTree p=T;
while(p||!emptyStack(S)){
if(p){
visit(p->data);
Push(S,p);
p=p->lchild;
}
else{
Pop(S,p);
p=p->rchild;
}
}
return OK;
}
//中序遍历
void InOrderTraverse(Bitree &T){
Stcak S;
InitStack(S);
BiTree p=T;
while(p||!emptyStqck(S)){
if(p){
Push(S,p);
p=p->lchild;
}
else{
Pop(S,p);
visit(p->data);
p=p->rchild;
}
}
return OK;
}
//后序遍历
void PostOrderTraver(BiTree &T){
Stack S;
InitStack(S);
BiTree p=T;
while(p||!emptyStack(S)){
if(p){
push(S,p);
p=p->lchild;
}
else{
if(p->rchild==NULL||pre==p->rchild){
visit(T->data);
pre=p;
p=NULL;
}
else{
p=p->rchild;
}
}
}
return OK;
}
//层次遍历二叉树,借助队列
void LevelOrderTreaverse(BiTree &T){
Queue Q;
InitQueue(Q);
BiTree p=T;
Enqueu(Q,p);
while(!emptyQueue(Q)){
DeQueue(Q,p);
if(p){
visit(p->data);
EnQueue(Q,p->lchild);
EnQUeue(Q,p->rchild);
}
}
return OK;
}
-------------------------------------------------------------------------------------------
查找某个节点x
1.查找某个信息是否在二叉树中(先序递归遍历)
void searchch(BITree T,char ch){
BiTree p=T;
if(p){
if(p->data==ch)
return p;
else{
searchch(T->lchild,ch);
searchch(T->rchild,ch);
}
}
}
---------------------------------------------------------------------------------------------
插入节点,删除节点,交换左右子树
1.插入节点
在遍历的基础上找到其父节点再插入。
2.删除节点
在遍历的基础上找该节点再删除。
3.交换左右子树
//递归法
void exchange(BiTree T){
BiTree item;
if(T){
exchange(T->lchild);
exchange(T->rchild);
item=T->lchild;
T->lchild=T->rchild;
T->rchild=item;
}
}
//非递归法
利用非递归遍历交换
----------------------------------------------------------------------------------------------
求节点个数/叶子节点个数,树的深度
1.树的结点个数
//递归求解
void NodeNum(BiTree T)
{
if(!T)
return 0;
else
return NodeNum(T->lchild)+NodeNum(T->rchild)+1;
}
//非递归求解
利用非递归遍历方法求解
2.求叶子节点个数:
//递归求解
void leavenum(BiTree T){
if(T){
if(T->lchild==NULL&&T->rchild==NULL)
return 1;
else
return leavenum(T-lchild)+leavenum(T->rchild);
}
}
//非递归求解
利用非递归遍历求解
3.求二叉树的深度
void depth(BiTree T){
BiTree P=T;
int lh=0,rh=0;
if(!p)
return 0;
else{
lh=depth(T->lchild);
rh=depth(T->rchild);
return (lh>rh?lh:rh)+1;
}
}
---------------------------------------------------------------------------------------------
判断俩棵树是否相等
void is_equal(BiTree T1,BiTree T2){
int t=0;
if(!T1&&!T2)
t=1;
else{
if(T1&&T2){
if(T1->data==T2->data){
if(is_equal(T1->lchild,T2->lchild)){
if(is_equal(T1->rchild,T2->rchild))
t=1;
}
}
}
}
return t;
}
二叉树的基本操作
标签:
原文地址:http://www.cnblogs.com/yujon/p/5467593.html