zoukankan      html  css  js  c++  java
  • 二叉树的基本操作

    一、定义数据类型:
     
    //二叉树节点
    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;
    }
  • 相关阅读:
    Linux日志管理系统rsyslog
    Linux访问权限控制及时间同步实践
    Linux系统自动化安装之cobbler实现
    【转】java取整和java四舍五入方法
    The web application [ ] registered the JDBC driver [net.sourceforge.jtds.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver
    Python学习笔记之函数式编程
    Java去重字符串的两种方法以及java中冒号的使用
    Python学习之字符串格式化
    Python学习之文件操作
    Python学习笔记之爬虫
  • 原文地址:https://www.cnblogs.com/yujon/p/5467593.html
Copyright © 2011-2022 走看看