二叉樹的構建以及遍歷
阿新 • • 發佈:2022-01-15
一、前言
今天學習了下二叉樹的構建以及遍歷,感覺還是挺簡單的。
二、樹的構建
我們利用輸入的字串,依次是從根節點到左兒子再到右兒子,也就是根據字元如果不是'#'就建立節點返回,如果是,再建立它的左右節點,依次結束樹的建立。
比如說我們輸入一串字串“AB#D##C##”(#代表空)
它的樹圖為:
程式碼實現為:
1 node *CreateTree() 2 { 3 scanf("%c",&ch); 4 node *Tree; 5 if(ch == '#')//空節點則返回 6 Tree = NULL; 7 else{ 8 Tree = new node();//c++申請空間的方法,c語言的為Tree = (node *)malloc (sizeof(node)); 9 Tree->date = ch; 10 Tree->leftChild = CreateTree();//建立左孩子節點 11 Tree->rightChild = CreateTree();//建立右孩子節點 12 } 13 return Tree; 14 }
三、樹的遍歷:
1.前序遍歷:
所謂前序遍歷,就是先從根部,走左子樹,再走右子樹。
根據畫的樹圖可以標明順序為
程式碼實現如下:
1 void PreTraverse(node *root)//前序遍歷 2 { 3 if(root == NULL) 4 return; 5 else { 6 printf("%c",root->date); 7 PreTraverse(root->leftChild); 8 PreTraverse(root->rightChild);//AB#D##C## 9 } 10 }
2.中序遍歷:
所謂中序遍歷就是,先走左子樹,再走根部,再走右子樹。
根據樹圖不難寫出順序如下:
程式碼實現就是在前序的情況下換下printf的位置即可
1 void MidTraverse(node *root)//中序遍歷 2 { 3 if(root == NULL) 4 return; 5 else { 6 MidTraverse(root->leftChild); 7 printf("%c",root->date); 8 MidTraverse(root->rightChild); 9 } 10 }
3.後序遍歷:
後序遍歷就是先走左子樹,再走右子樹,再走根部
樹圖為:
程式碼改動也不大,如下:
1 void AftTraverse(node *root)//後序遍歷 2 { 3 if(root == NULL) 4 return; 5 else { 6 AftTraverse(root->leftChild); 7 AftTraverse(root->rightChild); 8 printf("%c",root->date); 9 } 10 }
四、完整的程式碼以及執行情況
1 #include "bits/stdc++.h" 2 using namespace std; 3 struct node{ 4 char date; 5 node *leftChild; 6 node *rightChild; 7 }; 8 char ch; 9 node *CreateTree() 10 { 11 scanf("%c",&ch); 12 node *Tree; 13 if(ch == '#')//防止陣列越界 14 Tree = NULL; 15 else { 16 Tree = new node(); 17 Tree->date = ch; 18 Tree->leftChild = CreateTree(); 19 Tree->rightChild = CreateTree(); 20 } 21 return Tree; 22 } 23 void PreTraverse(node *root)//前序遍歷 24 { 25 if(root == NULL) 26 return; 27 else { 28 printf("%c",root->date); 29 PreTraverse(root->leftChild); 30 PreTraverse(root->rightChild);//AB#D##C## 31 } 32 } 33 void MidTraverse(node *root)//中序遍歷 34 { 35 if(root == NULL) 36 return; 37 else { 38 MidTraverse(root->leftChild); 39 printf("%c",root->date); 40 MidTraverse(root->rightChild); 41 } 42 } 43 void AftTraverse(node *root)//後序遍歷 44 { 45 if(root == NULL) 46 return; 47 else { 48 AftTraverse(root->leftChild); 49 AftTraverse(root->rightChild); 50 printf("%c",root->date); 51 } 52 } 53 int main() 54 { 55 node *root; 56 root = CreateTree(); 57 PreTraverse(root); 58 printf("\n"); 59 MidTraverse(root); 60 printf("\n"); 61 AftTraverse(root); 62 printf("\n"); 63 return 0; 64 }
五、總結
今天是放假時間,順便補個時長,複習了一下二叉樹的構建與遍歷,感覺收穫了挺多的,加油!
本文來自部落格園,作者:{scanner},轉載請註明原文連結:{https://home.cnblogs.com/u/scannerkk/}