1. 程式人生 > 其它 >二叉樹的構建以及遍歷

二叉樹的構建以及遍歷

一、前言

  今天學習了下二叉樹的構建以及遍歷,感覺還是挺簡單的。

二、樹的構建

  我們利用輸入的字串,依次是從根節點到左兒子再到右兒子,也就是根據字元如果不是'#'就建立節點返回,如果是,再建立它的左右節點,依次結束樹的建立。

  比如說我們輸入一串字串“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/}