二叉樹的非遞迴後序遍歷

2021-09-28 07:35:02 字數 3243 閱讀 3269

題目

『』』description

給定一組輸入資料,要求按照該輸入資料構造一顆二叉樹並且使用非遞迴的後序遍歷演算法遍歷該二叉樹。ps:不能使用遞迴後序遍歷演算法,必須是非遞迴。

input

按照滿二叉樹的對應位置(即將輸入的元素層序按從根到葉節點,同層按從左到右輸入)輸入一串資料,例如:1 2 3 # 5 6 # # #10 # # 13,以空格分開,其中#號代表對應的節點處為空,其對應的二叉樹為:

這個題沒啥好說的,可以參考我之前寫的先序輸出,道理一樣

先序排列

class

node

(object):

def__init__

(self, lchild=

none

, rchild=

none

, elem=0)

: self._elem, self._lchild, self._rchild = elem, lchild, rchild

@property

defelem

(self)

:if self._elem is

'#':

return

none

return self._elem

@property

deflchid

(self)

:return self._lchild

@property

defrchild

(self)

:return self._rchild

@elem.setter

defelem

(self, elem)

: self._elem = elem

@lchid.setter

deflchild

(self, lchild)

: self._lchild = lchild

@rchild.setter

defrchild

(self, rchild)

: self._rchild = rchild

class

bintree

(object):

def__init__

(self, elem=

none):

if elem is

notnone

: self.root = node(

none

,none

, elem)

else

: self.root =

none

def(self, elem)

:if self.root is

none

: self.root = node(

none

,none

, elem)

else

: queue =

[self.root]

while

len(queue)

>0:

cur = queue.pop(0)

if cur.lchild is

none

: cur.lchild = node(

none

,none

, elem)

return

elif cur.rchild is

none

: cur.rchild = node(

none

,none

, elem)

return

else

:def

layer_order

(self)

:if self.root is

none

:print

('none'

)else

: queue =

[self.root]

while queue:

node = queue.pop(0)

print

(node.elem)

if node.lchild is

notnone

:if node.rchild is

notnone

:def

pre_order

(self)

:if self.root is

none

:return

else

: stack =

[self.root]

result =

while stack:

cur = stack.pop(

)if cur and cur.elem:

return result

deflate_order

(self)

:if self.root is

none

:return

else

: stack =

[self.root]

result =

while stack:

cur = stack.pop(

)if cur and cur.elem:

result.reverse(

)return result

mytree = bintree(

)temp_list =

list

(input()

.split(

" ")

)for i in

range

(len

(temp_list)):

)# answer = list(map(int, mytree.pre_order()))

answer = mytree.late_order(

)for i in

range

(len

(answer)):

print

(answer[i]

)

二叉樹非遞迴後序遍歷

注釋 後序非遞迴遍歷的難處就在,最右結點無法直接找到後繼結點,後序線索化二叉樹在這裡就不能使用遞迴了,其實知道了遞迴的運作過程就不難理解為何不能用遞迴後序線索化了遞迴詳細執行過程a b c d e f h 當遍歷到最左邊的時候,d沒有左右結點了,輸出d,需要返回b去遍歷b的右子樹,e沒有左右結點e輸...

後序非遞迴遍歷二叉樹

後序遍歷的非遞迴演算法中節點的進棧次數是兩個,即每個節點都要進棧兩次,第二次退棧的時候才訪問節點。第一次進棧時,在遍歷左子樹的過程中將 根 節點進棧,待左子樹訪問完後,回溯的節點退棧,即退出這個 根 節點,但不能立即訪問,只能借助於這個 根 去找該 根 的右子樹,並遍歷這棵右子樹,直到該右子樹全部遍...

二叉樹後序遍歷 非遞迴

二叉樹後序遍歷 非遞迴 這裡我們約定 空的節點用空格表示,按照前序遍歷來建立樹!main.cpp 2 include iostream 3using namespace std 4typedef struct node binode,bitree 9typedef struct node1stack...