1. 程式人生 > >c二叉樹

c二叉樹

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

typedef char ElemType;

//二叉樹的二叉連結串列結構,也就是二叉樹的儲存結構,1個數據域,2個指標域(分別指向左右孩子)

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

//二叉樹的建立,按前序遍歷的方式建立二叉樹,當然也可以以中序或後序的方式建立二叉樹
void CreateBiTree(BiTree *T)
{
    ElemType ch;
    cin >> ch;
    if (ch == '#')
        *T = NULL;  //保證是葉結點
    else
    {
        *T = (BiTree)malloc(sizeof(BiTNode));
        //if (!*T)
            //exit(OVERFLOW); //記憶體分配失敗則退出。
        (*T)->data = ch;//生成結點
        CreateBiTree(&(*T)->lchild);//構造左子樹
        CreateBiTree(&(*T)->rchild);//構造右子樹    
    }
}
//表示對遍歷到的結點資料進行的處理操作,此處操作是將樹結點前序遍歷輸出
void operation1(ElemType ch)
{
    cout << ch << " ";
}
//此處在輸出的基礎上,並輸出層數
void operation2(ElemType ch, int level)
{
       cout << ch << "在第" << level << "層" << endl;
}


//遞迴方式前序遍歷二叉樹
void PreOrderTraverse(BiTree T, int level)
{
    if (T == NULL)
        return;
/*此處表示對遍歷的樹結點進行的操作,根據你自己的要求進行操作,這裡只是輸出了結點的資料*/
    //operation1(T->data);
    operation2(T->data, level); //輸出了層數

    PreOrderTraverse(T->lchild, level + 1);
    PreOrderTraverse(T->rchild, level + 1);
}

//遞迴方式中序遍歷二叉樹

void InOrderTraverse(BiTree T,int level)
{
if(T==NULL)
return;
InOrderTraverse(T->lchild,level+1);

//operation1(T->data);
operation2(T->data, level); //輸出了層數

InOrderTraverse(T->rchild,level+1);
}

//遞迴方式後序遍歷二叉樹

void PostOrderTraverse(BiTree T,int level)
{
if(T==NULL)
return;
PostOrderTraverse(T->lchild,level+1);
PostOrderTraverse(T->rchild,level+1);

//operation1(T->data);
operation2(T->data, level); //輸出了層數
}


int main()
{
    int level = 1; //表示層數
    BiTree T = NULL;
    cout << "請以前序遍歷的方式輸入擴充套件二叉樹:"; //類似輸入AB#D##C##
    CreateBiTree(&T);// 建立二叉樹,沒有樹,怎麼遍歷

    cout << "遞迴前序遍歷輸出為:" << endl;
    PreOrderTraverse(T, level);//進行前序遍歷,其中operation1()和operation2()函式表示對遍歷的結點資料進行的處理操作
    cout << endl;

    cout << "遞迴中序遍歷輸出為:" << endl;
    InOrderTraverse(T, level);
    cout << endl;

    cout << "遞迴後序遍歷輸出為:" << endl;
    PostOrderTraverse(T, level);
    cout << endl;

    return 0;
}