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 ...