二叉樹的遍歷

2021-07-09 13:19:36 字數 2119 閱讀 7797

看了一下資料結構中樹的相關知識,樹這一章還是很重要的,直接說知識點吧

一、基本概念

樹:n(n >= 0)個結點的有限集合

結點的度:結點擁有子樹的個數

樹的度:樹中所有度的最大值  (注意是 最大值)

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

葉子結點:度為0的節點

滿二叉樹:在深度為k的滿二叉樹中,1至k-1層每個結點均有兩個孩子。顧名思義,也就是除過葉子結點,其他的節點都有左右孩子。

滿二叉樹的連續編號:從根節點開始,按層從上到下,層內從左到右,逐個對每個結點進行編號1,2,3...,n。

完全二叉樹:深度為k,節點數為n (n <= 2^k-1)的二叉樹,當且僅當其n個結點與滿二叉樹中連續編號為1至n的結點位置一一對應時,稱為完全二叉樹。

滿二叉樹一定是完全二叉樹,但是完全二叉樹不一定是滿二叉樹。

我覺得就這些概念需要注意一下,其他還有許多概念,根據字面意思大家就知道是指什麼,這裡就不多說了。

二、二叉樹的遍歷

二叉樹的遍歷有兩種方法,一種是遞迴,另一種是非遞迴。遞迴的特別簡單,就是在訪問順序上不同,還是先說一下遞迴吧,就拿先序遍歷的來看。

void preorder(bitree root)

}

中序遍歷和後序遍歷只是那三個的呼叫順序不同,根據各自的定義,放在合適的位置就好。遞迴方法實現確實很簡單,缺點是執行效率低,消耗時間和空間資源比較多,所以還是重點說一下非遞迴的這三種遍歷。

其實在大多數的遞迴問題用非遞迴解決時,都用到了棧,在二叉樹的訪問過程中,在第一次訪問該結點時,應該保留該結點的資訊,保證下次經過時可以使用該結點的資訊。就用中序遍歷來講,如果沒有儲存父母結點的資訊當從左子樹返回時,就沒有辦法找到其父母結點的資訊。所以,在進入左子樹之前儲存結點的資訊是必要的。先序遍歷也是如此。但是後序遍歷有些不同,從左子樹返回後,要讀取棧頂結點的資訊,但是不能彈出,因為要先訪問右子樹再訪問父母結點,所以結點資訊要繼續保留,方便訪問完右子樹後訪問該結點。

1.先序遍歷

(1)基本思想

從根結點開始,重複下面兩步操作,條件為 當前結點不為空 或者 棧不為空。

a.訪問當前結點,當前結點進棧,進入其左子樹,直到當前結點為空。

b.如果棧不為空,則棧頂元素退棧,並進入其右子樹。

(2)主要**

void perorder(bitree root)

if(!empty(s)) }

}

2.中序遍歷

(1)基本思想:

從根結點開始,重複下面兩步操作,條件為 當前結點不為空 或者 棧不為空。

a.當前結點入棧,進入其左子樹,重複操作,直至當前結點為空。

b.如果棧不為空,棧頂結點退棧,訪問棧頂結點,並進入其右子樹。

其實與先序遍歷不同的就是,先序遍歷是第一次訪問就訪問,而中序遍歷是左子樹訪問完之後再訪問。

(2)核心**

void inorder(bitree root)

if(!empty(s)) }

}

3.後序遍歷

後序遍歷比較複雜,首先,如何判斷是左子樹返回的還是右子樹返回的,這關係到棧頂的上層結點時否應該出棧。

可以用tag來標記,也可以換一種思路,判斷剛返回的是不是當前棧頂的右孩子,如果是右孩子或者當前棧頂的右孩子為空,則需要出棧,訪問出棧的p結點,並將p賦給q,q用來記錄剛剛被訪問過的結點。然後將p賦為空,賦空是防止再次訪問該棵樹。如果不是,說明其右孩子未被訪問,則訪問其右孩子。

(1)基本思想

從根結點開始,重複下面兩步操作,條件為 當前結點不為空 或者 棧不為空。

a.當前結點進棧,並進入其左子樹,重複該操作直至當前結點為空。

b.若棧不為空,判斷棧頂結點p的右孩子是否為空,右子樹是否剛被訪問。是,則退棧,訪問p結點,p賦給q,p置為空。不是則進入其右子樹.

(2)核心**

void postorder(bitree root)	

if(!empty(s))

else

}}}

對於三種遍歷演算法就總結這麼多,其實基本思想知道後,**寫起來很容易,總之還是思想重要啊。一定要懂 了思想,再開始寫**。

二叉樹的遍歷 二叉樹遍歷與儲存

在資料結構中,二叉樹是非常重要的結構。例如 資料庫中經常用到b 樹結構。那麼資料庫是如何去單個查詢或者範圍查詢?首先得理解二叉樹的幾種遍歷順序 先序 中序 後序 層次遍歷。先序 根節點 左子樹 右子樹 中序 左子樹 根節點 右子樹 後序 左子樹 右子樹 根節點 按層級 class node if c...

構建二叉樹 遍歷二叉樹

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

玩轉二叉樹(二叉樹的遍歷)

時間限制 400 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越 給定一棵二叉樹的中序遍歷和前序遍歷,請你先將樹做個鏡面反轉,再輸出反轉後的層序遍歷的序列。所謂鏡面反轉,是指將所有非葉結點的左右孩子對換。這裡假設鍵值都是互不相等的正整數。輸入格式 ...