二叉樹遍歷

2021-06-18 02:22:40 字數 1752 閱讀 9825

先來了解一些概念

樹是結點的有限集合

,必須符合條件

當n=0時,為空樹

當n>0時,除根結點外,其他結點為m(m>0)個不相交的非空集合

樹的度:所有結點的度的最大值。

樹的深度:所有結點層次的最大值

是在樹的結構上建立的,比樹的定義更要嚴密。

區別在於:二叉樹只有左,右子樹我們先來對比下

為有右子樹為空的二叉樹

b)為左子樹為空的二叉樹

c)是一顆子樹的樹

深度遍歷

廣度遍歷

非遞迴遍歷

共同點:

都具有先序遍歷。

訪問根結點,遍歷左子樹,遍歷右子樹

也稱為內部遍歷採用棧的形式,根據二叉樹自身構成,訪問節點和子樹的不同順序,分別先序,中序和後序遍歷

例項:

如上圖,它的先序遍歷是怎樣被訪問的

a的左子樹有

bdgeh

,根據,根,左,右的訪問順序,依次訪問,最後的順序為 

abdgehcf

採用佇列的形式,逐層向下遍歷,每層從左到右順序訪問

如下圖:

訪問的次序為

a,b,c,d,ef,g,h

也稱為外部遍歷,是棧和佇列的結合,和遞迴的不同點在於,非遞迴運用迴圈的特點,如果一測子樹是否為空,直到迴圈為空為止才肯結束。

非遞迴也是分為先,中,後序遍歷的。

具體的一些演算法結構如下

對於任一結點p:

1)訪問結點

p,並將結點p入棧

; 2)判斷結點

p的左孩子是否為空,若為空,則取棧頂結點並進行出棧操作,並將棧頂結點的右孩子置為當前的結點

p,迴圈至

1);若不為空,則將

p的左孩子置為當前的結點p;

3)直到p為

null

並且棧為空,則遍歷結束。

具體的c演算法如下

void preorder2(bintree*root)     //非遞迴前序遍歷

if(!s.empty())}}

後序與中序的遍歷順序與遞迴的訪問基本也是相同的這裡不在累述。

二叉樹的遍歷,有深度,廣度和非遞迴的遍歷。

它們的相同點:都是按照某種順序,訪問根,

左右子樹

不同點:深度遍歷是運用棧的特點,廣度遍歷是運用佇列特點,而非遞迴是結合以上兩種方式(比較繁瑣)。二叉樹的遍歷為資料的查詢提供了很大的遍歷。

構建二叉樹 遍歷二叉樹

陣列法構建二叉樹 public class main public static void main string args 用陣列的方式構建二叉樹 public static void createbintree 把linkedlist集合轉成二叉樹的形式 for int j 0 j 最後乙個父節...

二叉樹遍歷

二叉樹的遍歷非常重要,但對已一棵比較複雜的樹,要寫出它的先 中 後序遍歷,往往不是那麼簡單,也很容易犯錯。這裡介紹一種比較直觀且不容易犯錯的方法。對於圖1所示的二叉樹,要寫出它的先 中 後序遍歷,往往很容易出錯。圖 1 其實,我們可以用圖2中的紅線描畫出二叉樹的輪廓。圖 2 而對於樹上的每乙個節點,...

二叉樹遍歷

描述 華為實習生招聘,有一道類似如下的題目 給出二叉樹,如圖1所示 圖 1 二叉樹 要求給出中序遍歷的結果。下面分別就前序遍歷 中序遍歷 後序遍歷進行分析。規律 前序遍歷 根在前 子樹在根後且左子樹比右子樹靠前 中序遍歷 根在中 左子樹在根左邊,右子樹在根右邊 後序遍歷 根在後 子樹在根前且左子樹比...