程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 數據結構-練習 5 二叉樹的建立 遍歷

數據結構-練習 5 二叉樹的建立 遍歷

編輯:C++入門知識

二叉樹是數據結構的最重要的內容之一,之所以引入二叉樹,是因為良好的數據結構非常有助於數據的排序,查詢等操作,也是在空間和效率上做個平衡!!

    二叉樹的定義:每個節點至多有倆顆子樹(即二叉樹中不存在度大於2的節點),並且,二叉樹的子樹有左右之分,其次序不能任意顛倒    形如:

                                                           \                                                            

                                                                                                                                                                                                                                   

                                                                                                                                         節選自:《數據結構》 嚴蔚敏 圖6.4

 

  二叉樹的分類:滿二叉樹,完全二叉樹,一般二叉樹(暫且列舉簡單的)。

(a)滿二叉樹,,根節點的度為1,葉節點的度為0,其余節點的度為2.

(b)完全二叉樹:理解上很簡單,在滿二叉樹的基礎上,去掉序號靠後的節點,注意必須從倒數第一個點算起。b 就是,而c,d 都不是。因此c,d只是一般的二叉樹。

二叉樹的幾個重要術語: 度,深度,根節點,雙親,葉節點,子樹。

度:每個節點可以有的子節點的個數。深度:層數;根節點:最頂層的那個點;雙親:其實是一個節點,如(a)中4和5的雙親是2;葉節點:度為0的節點;子樹:如(a),做標記的部分是1的子樹。

  樹的相關性質:1,第i層上至多有2的(i-1)次方個節點;

                               2,深度為k的二叉樹至多有2^k-1個節點;

                               3,度為0 的節點數n0,度為2的節點數n2,則n0=n2+1;

                               4,主要是關於節點之間的位置關系,啰嗦一堆,其實很簡單,就不再貼出來了。

 

樹的建立和遍歷:

                              包括前序 中序  和後序 ,其實就是元素訪問的順序,比如如上圖 (d):前序 124536 ,  中序:425136 , 後序: 452631。簡單畫畫就可以了。

代碼如下:

                              

[cpp] /*
email:[email protected]
qq:501968942
*/ 
 
#include<iostream>  
using namespace std; 
struct Tnode 

 char value; 
 struct Tnode* lChild; 
 struct Tnode* rChild; 
 
}; 
typedef Tnode* BiTree; 
 
 void InitBiTree(BiTree& T) 

  
 
  char inChar=getchar(); 
  //# 表示空節點,但是也要輸入,為了保證樹的完整性  
  if(inChar=='#') 
      T=0; 
  else 
  { 
   T=(BiTree)malloc(sizeof(Tnode)); 
   if(!T) throw "Invalid Address"; 
    else 
    { 
   T->value=inChar; 
   InitBiTree(T->lChild); 
   InitBiTree(T->rChild); 
    } 
   
  } 
  
  

//前序訪問  
void PreOrder(BiTree & T) 

     
  if(T) 
  { 
      cout<<"node is: "<<T->value<<endl; 
      PreOrder(T->lChild); 
      PreOrder(T->rChild); 
   
  } 
 
 

//中虛訪問  
void InOrder(BiTree &T) 

     
    if(T) 
    {   InOrder(T->lChild); 
        cout<<"node is : "<<T->value<<endl; 
        InOrder(T->rChild); 
     
    } 
 
 

//後續訪問  
void PostOrder(BiTree &T) 

     
    if(T) 
    {   
        PostOrder(T->lChild); 
        PostOrder(T->rChild); 
        cout<<"node is : "<<T->value<<endl; 
         
     
     
    } 
 
 

 
 
int main() 

 
  
  
BiTree t; 
cout<<"請輸入節點值:"; 
InitBiTree(t); 
cout<<"前序訪問:"<<endl; 
PreOrder(t); 
cout<<"中序訪問:"<<endl; 
InOrder(t); 
cout<<"後序訪問:"<<endl; 
PostOrder(t); 
 
 
  
 

/*
email:[email protected]
qq:501968942
*/

#include<iostream>
using namespace std;
struct Tnode
{
 char value;
 struct Tnode* lChild;
 struct Tnode* rChild;

};
typedef Tnode* BiTree;

 void InitBiTree(BiTree& T)
{
 

  char inChar=getchar();
  //# 表示空節點,但是也要輸入,為了保證樹的完整性
  if(inChar=='#')
   T=0;
  else
  {
   T=(BiTree)malloc(sizeof(Tnode));
   if(!T) throw "Invalid Address";
    else
 {
   T->value=inChar;
   InitBiTree(T->lChild);
   InitBiTree(T->rChild);
    }
 
  }
 
 
}
//前序訪問
void PreOrder(BiTree & T)
{
 
  if(T)
  {
   cout<<"node is: "<<T->value<<endl;
   PreOrder(T->lChild);
   PreOrder(T->rChild);
 
  }


}
//中虛訪問
void InOrder(BiTree &T)
{
 
 if(T)
 {   InOrder(T->lChild);
  cout<<"node is : "<<T->value<<endl;
  InOrder(T->rChild);
 
 }


}
//後續訪問
void PostOrder(BiTree &T)
{
 
 if(T)
 { 
  PostOrder(T->lChild);
  PostOrder(T->rChild);
  cout<<"node is : "<<T->value<<endl;
  
 
 
 }


}


int main()
{

 
 
BiTree t;
cout<<"請輸入節點值:";
InitBiTree(t);
cout<<"前序訪問:"<<endl;
PreOrder(t);
cout<<"中序訪問:"<<endl;
InOrder(t);
cout<<"後序訪問:"<<endl;
PostOrder(t);


 

}
輸入:124##5##3#6

                        \                                                     

可見,與之前手工推導結果一致,注意一定不要漏了 #,否則 不但輸出結果有誤,而且 不能正常如期運行

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved