演算法 資料結構 多種方法實現二叉樹遍歷

2021-10-11 18:01:14 字數 3327 閱讀 2322

public

static

class

node

}

主要借助佇列先進先出來實現

public

void

level

(node head)

queue

queue =

newlinkedlist

<

>()

;//將頭節點放入佇列中

queue.

add(head)

;//當佇列不為空時,每次彈出乙個節點,彈出就列印

while

(!queue.

isempty()

)if(cur.right != null)

}}

遞迴序:

二叉樹遞迴遍歷存在遞迴序,二叉樹中的每乙個節點在遞迴序中

都會通過該節點三次,第一次通過就列印該節點稱為先序遍歷

第二次經過該節點就列印稱為中序遍歷,第三次經過該節點就

列印稱為後序遍歷

//遞迴序

public

void

f(node head)

// 先序 列印head.value

f(head.left)

;//中序 列印head.value

f(head.right)

;//後序 列印head.value

}

非遞迴方式的深度遍歷都是借助棧來實現的,都遵循乙個原則:

彈出就列印 (後序利用兩個棧的方式是彈出就入棧)

先序
主要借助棧來實現頭,左,右的順序列印
public

void

pre(node head)

stack

stack =

newstack

<

>()

;//將頭節點壓入棧中

stack.

push

(head)

;//棧不為空時,彈出乙個節點就列印

while

(!stack.

isempty()

)if(head.left != null)

}}

中序
借助棧來實現 左,頭,右的列印順序。

本質是依次將二叉樹的左子樹加入棧中。

public

void

in(node head)

stack

stack =

newstack

<

>()

;//初始條件,head不為null或者站不為空,則繼續

while

(head != null ||

!stack.

isempty()

)else

}}

後序

方式一: 借助兩個棧來實現,基於先序排序,將先序排序稍作修改在入棧時,先左孩子,再右孩子,同時彈出節點時,不列印,而是直接放入另乙個棧中,直到第乙個棧為空時,依次列印第二個棧的值即可。

public

void

pos1

(node head)

stack

s1 =

newstack

<

>()

; stack

s2 =

newstack

<

>()

; s1.

push

(head)

;while

(!s1.

isempty()

)if(head.right != null)

}while

(!s2.

isempty()

)}

方式二:

借助棧和兩個變數來實現左,右,頭的順序列印

//整個流程都是先處理左孩子,再處理右孩子,再處理頭節點

//那麼在棧中為什麼順序沒有反過來,因為這裡用的是peek,並沒有poll

public

void

pos2

(node h)

stack

stack =

newstack

<

>()

; stack.

push

(h);

//c為當前遍歷的節點

node c = null;

//這裡的h代表上次列印的節點,

//開始預設為head(其實隨便指定乙個不相干的值即可)

while

(!stack.

isempty()

)else

if( c.right != null

&& h != c.right)

else

}}

利用有限幾個變數實現二叉樹的深度遍歷。

在morris遍歷中,如果乙個節點有左孩子,那麼morris遍歷就會經過該節點兩次(一次,是左孩子的最右節點指向null,第二次是左孩子的最右節點指向cur)。其餘節點只會經過一次。

morris遍歷的流程:

1、cur節點來到head節點

2、如果cur節點無左樹,則cur = cur.left

3、如果cur節點有左樹:

a、找到cur左樹上的最右節點mostright,如果

mostright節點為null,那麼 讓

mostright.right = cur, cur = cur.left;

b、如果mostright.right == cur,那麼讓

mostright.right = null, cur = cur.right;

public

static

void

morris

(node head)

node cur = head;

node mostright = null;

while

(cur != null)

if(mostright.right == null)

else

} cur = cur.right;

}}

資料結構演算法 二叉樹

二叉樹資料結構 bintree.h include templateclass bintree template class treenode type data treenode lchild 左,右子樹 treenode rchild template class bintree void cr...

二叉樹c 實現 資料結構與演算法 二叉樹基礎

在介紹二叉樹之前,我們需要先明白什麼是樹,因為二叉樹是樹的其中一種,因為我們用的最多,所以我們大多都在學習和了解二叉樹。樹是一種抽象資料型別或是實現這種抽象資料型別的資料結構,用來模擬具有樹狀結構性質的資料集合。它是由n n 0 個有限節點組成乙個具有層次關係的集合。樹具有以下特點 樹還有一些專用的...

資料結構與演算法之各種方法遍歷二叉樹

搬磚以前的題目 需要複習棧與佇列的小夥伴,可以到我的棧與佇列文章裡面搬磚 include include include include define maxsize 100 using namespace std typedef struct node btnode typedef struct ...