二叉树的基本操作

一、定义数据类型:
 
//二叉树节点
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;
}
原文地址:https://www.cnblogs.com/yujon/p/5467593.html