資料結構 二叉樹的遍歷

2021-08-01 18:01:14 字數 2951 閱讀 9397

一.實驗要求

二叉樹的遍歷操作是樹形結構其他眾多操作的基礎。本實驗旨在使學生進一步加深對二叉樹的先序、中序和後序等三種遍歷次序特點的理解,熟悉二叉鍊錶儲存結構,熟練掌握二叉樹上的遞迴演算法的設計技術。

二.實驗題目

構造一棵二叉樹,使用二叉鍊錶方式儲存,試設計程式,按照先序、中序、後序三種方式將這棵二叉樹遍歷出來,要求使用遞迴和非遞迴兩種實現方式。 

三.實現提示

1.二叉樹的線性鍊錶儲存資料結構:

[cpp]view plain

copy

typedef

char

elemtype;  

typedef

struct

bitreebitree;  

2.二叉樹的構造方式(參考):

[cpp]view plain

copy

bitree *create()  

rear++;  

q[rear]=s; //新結點或虛結點進隊

if(rear==1)  

root=s;  

else

if(rear%2==1) front++;   

//出隊

}  cin>>ch;  

}  return

root;  

}  

四.思考及選做

1.本實驗給出了建立二叉樹的二叉鍊錶儲存結構的一種方法,是否還有更簡單的方法?

2.對於非遞迴先序遍歷一般需要對每個結點進行二次進棧,這就需要乙個標誌位,如何處理這個標誌位,使得既不需要構造新的儲存結構也不需要增加乙個新的標誌棧。 

五.我的實現

[cpp]view plain

copy

#include

#include

#include 

#include

using

namespace

std;  

/*******************資料結構的定義*************************/

typedef

char

elemtype;  

typedef

struct

bitree  

bitree;  

/**********************功能函式*******************************/

/*建樹. 輸入格式為: a(b,c(d,e))

*/bitree *create(char

*s,bitree *&root)  

else

if(s[i]==

',')      

else

if(s[i]==

')')  

else

if(isalpha(s[i]))  

else

if(s[i+1]==

'(')  

s1.push(p);  

}  i++;  

}      

}  /*

遞迴列印函式 。 

*/void

display(bitree *root)  

if(root->rchild!=null)  

}  }  /*

先序遍歷。遞迴 。 

*/void

preorder1(bitree *root)  

}  /*先序遍歷。非遞迴 。 

1)訪問結點p,並將結點p入棧;

2)判斷結點p的左孩子是否為空,若為空,則取棧頂結點並進行出棧操作,並將棧頂結點的右孩子置為當前的結點p,迴圈至1);若不為空,則將p的左孩子置為當前的結點p;

3)直到p為null並且棧為空,則遍歷結束。

*/void

preorder2(bitree *root)  

if(!s.empty())  

}  }  /*

中序遍歷。遞迴。 

*/void

inorder1(bitree *root)  

}  /*中序遍歷。非遞迴。 

1)若其左孩子不為空,則將p入棧並將p的左孩子置為當前的p,然後對當前結點p再進行相同的處理;

2)若其左孩子為空,則取棧頂元素並進行出棧操作,訪問該棧頂結點,然後將當前的p置為棧頂結點的右孩子;

3)直到p為null並且棧為空則遍歷結束;

*/void

inorder2(bitree *root)  

if(!s.empty())  

}  }  /*

後序遍歷 。遞迴。 

*/void

postorder1(bitree *root)  

}  /*後序遍歷 。非遞迴。 

要保證根結點在左孩子和右孩子訪問之後才能訪問,因此對於任一結點p,先將其入棧。

如果p不存在左孩子和右孩子,則可以直接訪問它;或者p存在左孩子或者右孩子,但

是其左孩子和右孩子都已被訪問過了,則同樣可以直接訪問該結點。若非上述兩種情況,

則將p的右孩子和左孩子依次入棧,這樣就保證了每次取棧頂元素的時候,左孩子在右孩

子前面被訪問,左孩子和右孩子都在根結點前面被訪問。

*/void

postorder2(bitree *root)  

else

}      

}  /***********************main函式*************************/

intmain()  

return

0;  

}   

mysql 遍歷二叉樹 資料結構 二叉樹遍歷

這篇博文主要是研究二叉樹遍歷的遞迴與非遞迴演算法,有興趣的小夥伴可以了解下!二叉樹的遞迴遍歷 深度優先遍歷 先來張圖,看看各結點遍歷時的情況 二叉樹深度優先遍歷總結 分別為第一次,第二次,第三次進入某個結點 先序遍歷 先訪問根結點,然後先序遍歷左子樹,最後先序遍歷右子樹 根 左 右 中序遍歷 先中序...

資料結構 遍歷二叉樹

資料結構實驗之二叉樹二 遍歷二叉樹 time limit 1000ms memory limit 65536kb submit statistic problem description 已知二叉樹的乙個按先序遍歷輸入的字串行,如abc,de,g,f,其中,表示空結點 請建立二叉樹並按中序和後序的方...

資料結構 遍歷二叉樹

二叉樹的遍歷原理 二叉樹的遍歷是指從根節點出發,按照某種次序以此訪問二叉樹所有節點,使得每個節點被訪問一次且僅被訪問一次 二叉樹遍歷方法 1.前序遍歷 規則是若二叉樹為空,則空操作返回,否則先訪問根節點,然後前序遍歷左子樹,再前序遍歷右子樹 2.中序遍歷 規則是若樹為空,則空操作返回,否則從根節點開...