二叉樹遍歷

2022-09-19 04:24:09 字數 2036 閱讀 6087

在一棵樹中,頂點p是頂點v的父親,則它們的高度的關係是height(v) < height(p)
今天的內容主要有二叉樹節點binnode的建立,二叉樹的前,中,層次遍歷. 主要參照鄧俊輝老師的講解.

我這裡用到的是結構體,其他也可以.

struct binnode

binnode

(t _data,binnode

* _parent)

:data

(_data)

,parent

(_parent)

//把e當作當前節點的左孩子插入(預設左孩子為空)

binnode

*insaslc

(t const

& e)

;//把e當作當前節點的右孩子插入(預設you孩子為空)

binnode

*insasrc

(t const

& e)

;void

preorder

(binnode

* x)

;void

inorder

(binnode

* x)

;void

levelorder

(binnode

* x);}

;//把e當作當前節點的左孩子插入(預設左孩子為空)

template

<

typename t>

binnode

* binnode

::insaslc

(t const

& e)

//把e當作當前節點的右孩子插入(預設you孩子為空)

template

<

typename t>

binnode

* binnode

::insasrc

(t const

& e)

//先序遍歷

//遞迴實現

template

<

typename t>

void bintree

::preorder

(binnode

* x)

下面的是迭代實現

void bintree

::preorder

(binnode

*x)}

//中序遍歷

template

<

typename t>

void bintree

::inorder

(binnode

* x)

下面的是迭代實現

void bintree

::inorder

(binnode

* x)

while

(!s.

empty())}}

template

<

typename t>

void bintree

::levelorder

(binnode

* x)

}

遍歷其實不難理解,尤其是遞迴演算法。下面談談我對非遞迴,也就是迭代演算法的認識。

以先序遍歷為例,我們知道,先序遍歷就是vlr的流程,所以第乙個visit的必定是根節點;而又因為是非遞迴的方法,所以我們需要借助其他的資料結構來儲存節點:這裡主要有棧(lifo)和佇列(fifo)。

區別如下

圖畫的亂糟糟但確實有助於我理解,不懂的可以自己畫畫。

最後呢是用棧來儲存選定了儲存結構,接下來的事就比較簡單了。首先把便利的根節點存入棧中,然後while判空為真就停止,while裡取出棧頂元素,visit一下,然後pop。!!!!!接下來要把子女節點也加到棧中,因為棧的lifo原則,所以先讓右孩子進,然後是左孩子,如是迴圈即可。

構建二叉樹 遍歷二叉樹

陣列法構建二叉樹 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 二叉樹 要求給出中序遍歷的結果。下面分別就前序遍歷 中序遍歷 後序遍歷進行分析。規律 前序遍歷 根在前 子樹在根後且左子樹比右子樹靠前 中序遍歷 根在中 左子樹在根左邊,右子樹在根右邊 後序遍歷 根在後 子樹在根前且左子樹比...