木の巡回操作はrecursiveだと直感的だし
実装も簡単ですが、iterativeで解かない解けない場面のために
解けるようにしたいが、これは練習が必要である。
この問題や【アルゴリズム脳トレ】leetcode easy 589 N-ary tree preorder traversal
この問題を通して 【アルゴリズム脳トレ】leetcode easy 589 N-ary tree preorder traversal
実践したのだが、どうも難しい。多少慣れた気はしている。二分木のpre-order, in-order, post-orderの簡単でわかりやすい説明
でまとめてみたりもしている。
ここでは、
一つにシンプルな実装方法をマスターとしてここに記す。
忘れたときにここに戻ってきて思い出すのに役立ててほしい。
百聞は一見にしかず
注目したいのは、これらはN-aryということで2分木ではなく、子供が複数もてるという点だ。
ということで実装はこちら
# https://leetcode.com/problems/n-ary-tree-preorder-traversal/discuss/460888/Simple-Iterative-Python-Solutiono
# こいつをpostorderに改造する
class Solution:
def __preorder(self, root):
stack = [root]; res = []
while len(stack) > 0:
current = stack.pop()
res.append(current.val)
if current.children:
for node in current.children[::-1]:
stack.append(node)
return res
def __levelorder(self, root):
stack = [root]; res = []
while len(stack) > 0:
current = stack.pop(0)
res.append(current.val)
if current.children:
for node in current.children:
stack.append(node)
return res
"""
thanks I finally understand it by looking this solution.
https://leetcode.com/problems/n-ary-tree-postorder-traversal/discuss/432121/Python-Intuitive-Iterative-Solution-One-Stack
"""
def __postorder(self, root):
stack = [root]; res = []
while len(stack) > 0:
current = stack.pop()
res.insert(0, current.val)
if current.children:
for node in current.children:
stack.append(node)
return res
def postorder(self, root: 'Node') -> List[int]:
if not root:
return []
print("preorder: %s" % self.__preorder(root))
print("levelorder: %s" % self.__levelorder(root))
print("postorder: %s" % self.__postorder(root))
# n1 = Node(1)
# n2 = Node(2)
# n3 = Node(3)
# n4 = Node(4)
# n5 = Node(5)
# n6 = Node(6)
#
# n1.children = [n3, n2, n4]
# n3.children = [n5, n6]
n1 = Node(1)
n2 = Node(2)
n3 = Node(3)
n4 = Node(4)
n5 = Node(5)
n6 = Node(6)
n7 = Node(7)
n8 = Node(8)
n9 = Node(9)
n10 = Node(10)
n11 = Node(11)
n12 = Node(12)
n13 = Node(13)
n14 = Node(14)
n1.children = [n2, n3, n4, n5]
n3.children = [n6, n7]
n7.children = [n11]
n11.children = [n14]
n4.children = [n8]
n5.children = [n9, n10]
n8.children = [n12]
n9.children = [n13]
ans = Solution().postorder(n1)
print(ans)
コードは
と
を引用させて頂いている。
2分木のinorderも例もついでに乗せておく
こちらです。https://leetcode.com/problems/binary-tree-inorder-traversal/
class Solution_rec:
def __init__(self):
self.ans = []
def inorderTraversal(self, root: TreeNode) -> List[int]:
self.dfs(root)
return self.ans
def dfs(self, root: TreeNode) -> List[int]:
if root is None: return
self.dfs(root.left)
self.ans.append(root.val)
self.dfs(root.right)
return
class Solution_iterative:
def inorderTraversal(self, root: TreeNode) -> List[int]:
stack, order = [], []
curr = root
while curr or len(stack) > 0:
if curr:
stack.append(curr)
curr = curr.left
else:
curr = stack.pop()
order.append(curr.val) # inorder
curr = curr.right
return order
以上です