創作內容

18 GP

C 二元樹走訪

作者:貓貓風 ฅ●ω●ฅ│2017-12-31 01:32:30│巴幣:36│人氣:6555
.














這篇的主題與之前發的 C# Binary Search Tree traversal   相同

只是使用撰寫的語言不同,C比 C#低階很多,因此要達到相同效果

必須使用指標來實作,概念基本上都相同,純粹轉換語言撰寫此功能

程式主要一樣分兩大區塊

1. 二元樹的建立,資料加入 (insert)

2.二元樹的走訪,主要分三種 前序、中序、後序



  1. #include<stdio.h>  
  2. #include<stdlib.h>  
  3. #define number 5   
  4. struct tree  
  5. {  
  6. struct tree*left; //左子樹   
  7. int data;         //資料   
  8. struct tree*right;//右子樹   
  9. };  
  10. typedef struct tree node; //簡化 struct tree 為 node   
  11. typedef node*bnode;       //bnode 指向 node   
  12.    
  13. bnode binary_tree(bnode,int);// 二元樹建立  
  14. void preorder(bnode);  //   前序
  15. void inorder(bnode);   //   中序
  16. void postorder(bnode); //   後序
  17. void print(bnode);   //   印出執行結果
  18.    
  19.   
  20. int main()  
  21. {  
  22. int array[number],i;  
  23. bnode root = NULL;  //令根節點為空   
  24. printf("依序輸入 %d 筆資料\n\n",number);  
  25. for(i=0;i<number;i++)  
  26. {  
  27.   scanf("%d",&array[i]);  
  28.   root = binary_tree(root,array[i]);  
  29. }  
  30. printf("\n preorder:  ");  
  31. preorder(root);  
  32. printf("\n inorder:   ");  
  33. inorder(root);  
  34. printf("\n postorder: ");  
  35. postorder(root);  
  36. printf("\n\n");  
  37. system("pause");  
  38. return 0;  
  39. }  
  40.   
  41. void print(bnode ptr)  
  42. {  
  43.   printf("%d  ",ptr->data);  
  44. }  
  45.    
  46. void preorder(bnode ptr)  
  47. {  
  48.   if(ptr!=NULL)  
  49.   {  
  50.    print(ptr);  
  51.    preorder(ptr->left);  
  52.    preorder(ptr->right);  
  53.   }  
  54. }  
  55.    
  56.   void inorder(bnode ptr)  
  57. {  
  58.   if(ptr!=NULL)  
  59.   {  
  60.    inorder(ptr->left);  
  61.    print(ptr);  
  62.    inorder(ptr->right);  
  63.   }  
  64. }  
  65.    
  66.   void postorder(bnode ptr)  
  67. {  
  68.   if(ptr!=NULL)  
  69.   {  
  70.    postorder(ptr->left);  
  71.    postorder(ptr->right);  
  72.    print(ptr);  
  73.   }  
  74. }  
  75.    
  76. bnode binary_tree(bnode root,int val)  
  77. {  
  78.   bnode newnode,current,backup;  
  79.   newnode = (bnode)malloc(sizeof(node));
  80.   //把 bnode* sizeof(node)大小的記憶體位置,轉換成node指標,放到 root中  
  81.   newnode->left = NULL;  
  82.   newnode->data = val;  
  83.   newnode->right= NULL;  
  84.     
  85.   if(root == NULL)  
  86.   {  
  87.    root = newnode;  
  88.    return root;  
  89.   }  
  90.   else  
  91.   {  
  92.       for(current = root;current!=NULL;)  
  93.       {  
  94.         backup = current;  
  95.         if(current->data > val) //如果根節點的值比當前放入的值大   
  96.         {  
  97.          current = current->left; //當前節點改為根節點左邊的點   
  98.         }  
  99.         else  
  100.         {  
  101.          current = current->right;  
  102.         }  
  103.       }  
  104.       if(backup->data>val)  //如果根節點的值比當前放入的值大  
  105.       {  
  106.        backup->left = newnode; //給予根節點左邊的點配置記憶體空間(newnode)   
  107.       }  
  108.       else  
  109.       {  
  110.        backup->right = newnode;  
  111.       }  
  112.    }  
  113.    return root;  
  114. }  

執行結果



引用網址:https://home.gamer.com.tw/TrackBack.php?sn=3838037
All rights reserved. 版權所有,保留一切權利

相關創作

同標籤作品搜尋:C#|C++

留言共 6 篇留言

彩゛天空゜
起床ㄊㄓ

12-31 05:34

貓貓風 ฅ●ω●ฅ
很早哦12-31 09:35
透明
請問大大可以教學AVL樹嗎? 關於怎麼旋轉我還是搞不太清楚

12-31 09:46

貓貓風 ฅ●ω●ฅ
有空再看看 AVL我也很久沒碰了@@12-31 15:38
珀伽索斯(Ama)
XD變成這樣還是要好好的研究一下才行[e34]

01-01 20:57

貓貓風 ฅ●ω●ฅ
加油01-01 21:51
艾爾琈
涼涼新年快樂><不好意思這麼晚才來拜訪w

01-07 22:13

貓貓風 ฅ●ω●ฅ
不會喔 小綠新年快樂01-07 23:09
一模沒有兩樣
請問大大,看你文章學習,想請問最後一行為什麼是 return root 就能把整顆樹會傳出來,這裡有點搞不太懂
因為root好像只有在for迴圈裡指給current=root

06-19 23:55

貓貓風 ฅ●ω●ฅ
可以把ROOT想像成一個集合,一個集合裡可以有很多個元素(節點06-20 21:59
我也太廢了吧
還不錯

04-15 22:44

我要留言提醒:您尚未登入,請先登入再留言

18喜歡★s1234567 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:C# Call By R... 後一篇:Android SQLi...

追蹤私訊切換新版閱覽

作品資料夾

Willy218359巴哈的各位
我寫的小說更新了!不想錯過更新的讀者們可以追蹤我的小屋看更多我要大聲說11小時前


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】