二叉樹創建和遍歷

#include <stdio.h>
#include <stdlib.h>
// 帶返回值創建二叉樹 最簡單方法
//節點數據結構
struct bs_node
{
    int value;
    struct bs_node *left;
    struct bs_node *right;
};
typedef struct bs_node tree;
// tree *head,*p,*root;

//創建二元查找樹 有返回值的可以不傳參 沒有的話如何傳參
//輸入0代表到了某個葉子節點
tree *creat()
{
    int ch;
    tree *p=NULL;

    printf("input a num\n");
    scanf("%d",&ch);
    if(ch!=0)
    {
        p=(tree *)malloc(sizeof(tree));
        p->value=ch;
        printf("%d left child\n",ch);
        p->left=creat();
        printf("%d ringht child\n",ch);
        p->right=creat();
    }
    return p;
}

//先序遍歷
int preorder(tree *p)
{
    if(p!=NULL)
    {
        printf("%d\n",p->value);
        preorder(p->left);
        preorder(p->right);
    }
    return 0;
}
// zhongxubianli
int midorder(tree *p)
{
    if(p!=NULL)
    {
        midorder(p->left);
        printf("%d\n",p->value);
        midorder(p->right);
    }
    return 0;
}
// houxubianli
int postorder(tree *p)
{
    if(p!=NULL)
    {
        postorder(p->left);
        postorder(p->right);
        printf("%d\n",p->value);
    }
    return 0;
}


// main hanshu
int main(int argc, char const *argv[])
{
    //tree *root=(tree *)malloc(sizeof(tree));
    tree *root=NULL;
    root=creat();
    // printf("%d\n",root->value);
    // printf("%d\n",root->left->value);
    printf("11111111111111\n");
    preorder(root);

    printf("222222222222\n");
    midorder(root);

    printf("333333333333\n");
    postorder(root);

    return 0;
}

上面是帶返回值的創建函數,比較容易理解。創建和遍歷都是採用遞歸的方法。

#include <stdio.h>
#include <stdlib.h>
// 帶參數創建二叉樹 二層指針
//節點數據結構
struct bs_node
{
    int value;
    struct bs_node *left,*right;
};
typedef struct bs_node tree;
//帶參數的因爲考慮到參數爲*p的話需要改變p,這是不可以的 所以用二層指針 或者用指針的引用他們的在函數體內形式不一樣 以及如何調用
void creat(tree **p)
{
    int ch;
    printf("input a num\n");
    scanf("%d",&ch);
    *p=(tree *)malloc(sizeof(tree));
    (*p)->value=ch;

    if(ch==0)
    {
        *p=NULL;
        return;
    }
    else
    {
        printf("%d left child\n",ch);
        creat(&((*p)->left));

        printf("%d right child\n",ch);
        creat(&((*p)->right));
    }
}

int init(tree **p)
{
    *p=(tree *)malloc(sizeof(tree));
    (*p)->value=5;
    return 0;
}

void preoder(tree *p)
{
    if(p!=NULL)
    {
        printf("%d\n",p->value);
        preoder(p->left);
        preoder(p->right);
    }
    else
        return;
}

int main(int argc, char const *argv[])
{   
    tree *a=NULL;
    creat(&a);
    preoder(a);
    return 0;
}

上面採用的二層指針傳參

#include <stdio.h>
#include <stdlib.h>
//指針的引用帶參數創建二叉樹c文件
//節點數據結構
struct bs_node
{
    int value;
    struct bs_node *left,*right;
};
typedef struct bs_node tree;
//reference of a poiter as 調用方法及裏面p類型需要注意
int creat(tree *&p)
{
    int ch;
    printf("input a num\n");
    scanf("%d",&ch);
    p=(tree *)malloc(sizeof(tree));
    if(ch==0)
    {
        p=NULL;
    }
    else
    {

        p->value=ch;
        printf("%d left child\n",ch);
        creat(p->left);
        printf("%d right child\n",ch);
        creat(p->right);
    }
    return 0;
}


int preoder(tree *p)
{
    if(p!=NULL)
    {
        printf("%d\n",p->value);
        preoder(p->left);
        preoder(p->right);
    }
    return 0;
}
// 測試指針引用的例子
int test(tree *&p)
{
    p=(tree *)malloc(sizeof(tree));
    p->value=5555;
    return 0;
}

int main(int argc, char const *argv[])
{   
    tree *a=NULL;
    // test(a);
    creat(a);
    // printf("%d \n",a->value);
    preoder(a);
    return 0;
}

參數爲指針的引用總結。

我的個人總結:對於一個指針我們應該知道幾個性質,1指針變量,2指針變量的地址,3指針變量指向的內存區域。指針變量本身的內存區域一般爲4個字節(與編譯器有關,與它指向的內存區域大小無關,就算指向的是一個特別大的數據結構,它也只是一個數字,這個數字是特別大的數據結構的地址。它存了一個數字,存到那裏了呢?這個地方就是它的地址)。int *p;則p是指針變量,&p是它的地址,*p是它指向的東西。

二叉樹程序總結
主要在於指針傳參問題
1.一層指針傳參create(tree*P),可以修改*p,但堅決不允許改p,例如p=NUL,或者給p分配內存,這在函數體內部都是不對的,不適合建立二叉樹,也可能有奇怪的方法我不知道。。(使用帶返回值的可以解決一些問題{tree create();},例如不傳參在函數體內建立一個指針,對指針操作後返回指針,調用時候賦值給一個已經聲明的指針變量即可),

2.參數爲二層指針int create (tree **P),可以修改*p(一個指針),**P(一個結構體),不可以修改p,調用時候爲了避免創建二層指針顯得比較奇怪,用tree *P;create(&p)就可以。

3.參數爲指針的引用int create(tree *&p);p是一個單層指針(函數參數是一個指針p,但是傳遞的是p的地址),可以修改p,可以和1對比。調用 tree *P;create(p);

注:引用傳參需要用g++編譯,gcc不支持引用傳參

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章