數據結構(十一)——二叉樹的遍歷和建立

二叉樹的遍歷是指從根節點出發,按照某種次序依次訪問二叉樹中所有結點,使得每個結點被訪問一次且僅被訪問一次。其中關鍵詞是訪問和次序。


二叉樹的遍歷方法

1.前序遍歷
規則:
若二叉樹爲空,則 空操作返回,否則先訪問根結點,然後前序遍歷左子樹,在前序遍歷右子樹。下圖的遍歷順序爲ABDGHCEIF。

2.中序遍歷
規則:
若樹爲空,則空操作返回,否則從根結點開始,中序遍歷根結點的左子樹,然後是訪問根結點,最後中序遍歷右子樹。下圖順序爲GDHBAEICF。

3.後序遍歷
規則:
若樹爲空,則空操作返回,否則從左到右先葉子後結點的方式遍歷訪問左右子樹,最後訪問根結點,下圖的順序爲GHDBIEFCA。

4.層序遍歷
規則:
若樹爲空,則空操作返回,否則從樹的第一層,也就是根結點開始訪問,從上而下逐層遍歷,在同一層中,按從左到右的順序對結點進行訪問。下圖的順序爲ABCDEFGHI。


下面介紹算法和代碼演示:(代碼用遞歸的方式)
1.前序遍歷算法:
[cpp] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. <span style="font-size:18px;">void PreOrderTraverse(BiTree T)  
  2. {  
  3.     if(T == NULL)  
  4.     {  
  5.     return;  
  6.     }  
  7.     printf("%c",T->data);  //顯示結點數據  
  8.     PreOrderTraverse(T->lchild); //遍歷左子樹  
  9.     PreOrderTraverse(T->rchild); //遍歷右子樹  
  10. }</span>  

2.中序遍歷算法
[cpp] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. <span style="font-size:18px;">void InOrderTraverse(BiTree T)  
  2. {  
  3.     if(T == NULL)  
  4.     {  
  5.     return;  
  6.     }  
  7.     PreOrderTraverse(T->lchild); //遍歷左子樹  
  8.     printf("%c",T->data);  //顯示結點數據  
  9.     PreOrderTraverse(T->rchild); //遍歷右子樹  
  10. }</span>  

3.後序遍歷算法
[cpp] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. <span style="font-size:18px;">void PostOrderTraverse(BiTree T)  
  2. {  
  3.     if(T == NULL)  
  4.     {  
  5.     return;  
  6.     }  
  7.     PreOrderTraverse(T->lchild); //遍歷左子樹  
  8.     PreOrderTraverse(T->rchild); //遍歷右子樹  
  9.     printf("%c",T->data);  //顯示結點數據  
  10. }</span>  

二叉樹遍歷的性質:
已知前序遍歷序列和中序遍歷序列,可以唯一確定一顆二叉樹;
已知後序遍歷序列和中序遍歷序列,可以唯一確定一顆二叉樹;


二叉樹的建立:

我們將二叉樹中的每個結點的空指針引出一個虛結點,其值爲 特定值,比如“^”,下面我們建立二叉樹。
[cpp] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. <span style="font-size:18px;">void CreateBiTree(BiTree *T)  
  2. {  
  3.     char ch;  
  4.     scanf("%c",&ch);  
  5.     if(ch == '^')  
  6.     {  
  7.     *T = NULL;  
  8.     }  
  9.     else  
  10.     {  
  11.     *T = (BiTree)malloc(sizeof(BiTNode));  
  12.     if(!*T)  
  13.     {  
  14.         exit(1);  
  15.     }  
  16.     (*T)->data = ch;  
  17.     CreateBiTree(&(*T)->lchild);  
  18.     CreateBiTree(&(*T)->rchild);  
  19.     }  
  20. }</span>  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章