#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不支持引用傳參