天天看點

二叉樹算法

#include <iostream>
#include <stdio.h>
using namespace std;

typedef struct BiTNode{
    char data;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

BiTree createBiTree(BiTree T)
{
    char ch;
    cin>>ch;
    if(ch=='#')
        return NULL;
    else
    {
        T=new BiTNode;
        T->data=ch;
        T->lchild=createBiTree(T->lchild);
        T->rchild=createBiTree(T->rchild);
    }
    return T;
}
/*
BiTree createBiTree()
{
    BiTree T;
    char ch;
    cin>>ch;
    if(ch=='#')
        return NULL;
    else
    {
        T=new BiTNode;
        T->data=ch;
        T->lchild=createBiTree();
        T->rchild=createBiTree();
    }
    return T;
}*/

 //中序周遊
 void inTraverse(BiTree T)
 {
     if(T)
     {
         inTraverse(T->lchild);
         cout<<T->data<<" ";
         inTraverse(T->rchild);
     }
 }

 //先序周遊
 void preTraverse(BiTree T)
 {
     if(T)
     {
         cout<<T->data<<" ";
         preTraverse(T->lchild);
         preTraverse(T->rchild);
     }
 }

 //後序周遊
 void postTraverse(BiTree T)
 {
     if(T)
     {
         postTraverse(T->lchild);
         postTraverse(T->rchild);
         cout<<T->data<<" ";
     }
 }

 //層次周遊
 void levelTraverse(BiTree T)
 {
    BiTree p[];
    int f=,r=;
    if(T)
    {
        p[r++]=T;
        while(f!=r)
        {
            cout<<p[f]->data<<" ";
            if(p[f]->lchild)
                p[r++]=p[f]->lchild;
            if(p[f]->rchild)
                p[r++]=p[f]->rchild;
            f++;
        }
    }
 }

 //求結點數目
 int getNodes(BiTree T)
 {
     if(!T)
        return ;
     return getNodes(T->lchild)+getNodes(T->rchild)+;
 }

 //求葉子結點數
 int getleave(BiTree T)
 {
    if(!T)
        return ;
    if(!T->lchild&&!T->rchild)
        return ;
    return getleave(T->lchild)+getleave(T->rchild);

 }

 //求樹的深度
 int depth(BiTree T)
 {
     int ld,rd;
     if(!T)
        return ;
     ld=depth(T->lchild);
     rd=depth(T->rchild);
     return ld>rd?ld+:rd+;
 }

int main()
{
    BiTree T;
    T=createBiTree(T);//T=createBiTree();函數功能不需要參數時,形參就可以省寫
    cout<<"先序周遊序列為"<<endl;
    preTraverse(T);
    cout<<endl;
    cout<<"中序周遊序列為"<<endl;
    inTraverse(T);
    cout<<endl;
    cout<<"後序周遊序列為"<<endl;
    postTraverse(T);
    cout<<endl;
    cout<<"層次周遊序列為"<<endl;
    levelTraverse(T);
    cout<<endl;
    cout<<"結點總數為"<<getNodes(T)<<endl;
    cout<<"葉子結點總數為"<<getleave(T)<<endl;
    cout<<"樹的深度為"<<depth(T)<<endl;
    return ;

}
           

繼續閱讀