二叉樹的遍歷(遞迴)先中後序

2021-08-27 03:56:42 字數 2031 閱讀 8914

儲存結構

二叉樹的儲存結構有兩種:順序儲存結構和鏈式儲存結構,由於順序儲存結構存在的很大的侷限性,所以我們以鏈式儲存結構講解為主。

data域用於儲存對應的資料元素,lchildrchild分別表示左指標和右指標域,分別用於儲存左孩子和右孩子結點的位置,這種儲存結構又稱為二叉鍊錶儲存結構。下面給出結點型別的定義:

圖 1下面對圖1中的二叉樹來理解一下先中後序的遞迴遍歷,當你理解了之後就會發現遍歷so easy

先序遍歷(遞迴)

訪問順序:(1)訪問根結點

(2)先序遍歷左子樹

(3)先序遍歷右子樹

描述:由上面訪問順序的三個步驟你也能看出遞迴的思想,第一步先訪問根結點;第二步先序遍歷左子樹,這時你可以把左子樹單獨當做一棵樹再執行上述的三個步驟,訪問根結點,如果還有左子樹,再訪問左子樹的根結點......這就是遞迴的體現;第三步先序遍歷右子樹,跟第二步思想一樣先是訪問根節點,有左子樹先訪問左子樹,然後右子樹,直到樹被遍歷完。

圖1先序遍歷的結果為:abdecfg

對應的演算法描述如下:

void preorder(btnode *t)

}

中序遍歷(遞迴)

訪問順序:(1)中序遍歷左子樹

(2)訪問根結點

(3)中序遍歷右子樹

描述:由上面訪問順序的三個步驟你也能看出遞迴的思想,第一步中序遍歷左子樹,這時你可以把左子樹單獨當做一棵樹再執行上述的三個步驟,如果還有左子樹,先訪問左子樹,如果還有左子樹......直到左子樹的左孩子為空,第二步先訪問根結點;第三步中序遍歷右子樹,跟第一步思想一樣有左子樹先訪問左子樹,然後根結點,最後右子樹,直到樹被遍歷完。

圖1中序遍歷的結果為:dbeacfg

對應的演算法描述如下:

void inorder(btnode *t)

}

後序遍歷(遞迴)

訪問順序:(1)後序遍歷左子樹

(2)後序遍歷右子樹

(3)訪問根結點

描述:由上面訪問順序的三個步驟你也能看出遞迴的思想,第一步後序遍歷左子樹,這時你可以把左子樹單獨當做一棵樹再執行上述的三個步驟,如果還有左子樹,先訪問左子樹,如果還有左子樹......直到左子樹的左孩子或者右孩子為空,第二步後序遍歷右子樹,跟第一步思想一樣有左子樹先訪問左子樹,然後右子樹,最後根結點;第三步先訪問根結點,直到樹被遍歷完。

圖1後序遍歷的結果為:debfgca

對應的演算法描述如下:

void postorder(btnode *t)

}

總結

針對上述的先中後序的三種遞迴遍歷演算法,我們**一下**實現:都是遞迴呼叫方法,唯一不同的是函式visit()在遍歷方法中的位置不同。

先序遍歷:函式visit()在遞迴呼叫最前執行,這樣就能先訪問根結點。

中序遍歷:函式visit()在遞迴呼叫中間執行,這樣就能先訪問左子樹的結點然後訪問根結點。

後序遍歷:函式visit()在遞迴呼叫最後執行,這樣就能後訪問根結點。

二叉樹的先中後序遍歷

二叉樹的先中後序遍歷 package com.treenode 二叉樹先中後順序遞迴遍歷 public class diguibianli 先序遍歷 public static void preorder node head preorder head.left preorder head.righ...

二叉樹的先中後序遍歷

二叉樹相關概念 1.1 定義 二叉樹是一顆樹,其中每個節點都不能有多餘兩個兒子 這裡寫描述 1.2 重要性質 平均二叉樹的深度要比n小得多 n是該二叉樹的節點個數 這裡寫描述 二叉樹的表示方法說明 2.1 樹一般畫成圓圈並用一些直線連線起來,因為二叉樹實際上就是圖,但涉及到樹時,我們也不明顯地畫出 ...

二叉樹的先中後序遍歷

二叉樹 每個節點最多只有兩個字節點 js中通常用 object來模擬二叉樹 val 1,left 0,right 0 const bt right right right 先序遍歷演算法 preorder 根左右 1 訪問根節點 2 對根節點的左子樹進行先序遍歷 3 對根節點的右子樹進行先序遍歷 遞...