樹遍歷相關:二叉樹的遍歷、N叉樹的遍歷、N叉樹的層序遍歷
阿新 • • 發佈:2021-02-03
技術標籤:LeetCode刷題leetcode
文章目錄
一、二叉樹的中序遍歷
題目:給定一個二叉樹的根節點 root ,返回它的 中序 遍歷。
示例 1:
輸入:root = [1,null,2,3]
輸出:[1,3,2]
1、遞迴法(推薦)
很簡單,就不說後序和前序了!
# 中序遍歷為例
class Solution:
def inorderTraversal (self, root: TreeNode) -> List[int]:
# 法1: 遞迴
res = []
self.inorder(root, res)
return res
def inorder(self, root, res):
if root:
self.inorder(root.left, res)
res.append(root.val)
self.inorder(root.right, res)
return res
2、迭代法(瞭解)—中序遍歷
# 中序遍歷
class Solution:
def inorderTraversal(self, root: TreeNode) -> List[int]:
# 法2: 迭代-->棧
res, stack = [], []
while stack or root:
if root:
stack.append(root)
root = root.left
else:
temp = stack.pop()
res.append(temp.val)
root = node.right
return res
3、迭代法(瞭解)—前序遍歷
# 後序遍歷
class Solution:
def preorderTraversal(self, root: TreeNode) -> List[int]:
res, stack = [], []
while stack or root:
if root:
stack.append(root)
res.append(root.val)
root = root.left
else:
temp = stack.pop()
root = temp.right
return res
4、迭代法(瞭解)—後序遍歷
# 後序遍歷
class Solution:
def postorderTraversal(self, root: TreeNode) -> List[int]:
# 用前序遍歷的思想做後序遍歷
res, stack = [], []
while stack or root:
if root:
res.append(root.val)
stack.append(root)
root = root.right
else:
temp = stack.pop()
root = temp.left
# 上面是根、右、左遍歷。res翻轉就得到了左右根
return res[::-1]
二、N叉樹的遍歷
N叉樹只有前序、後序遍歷!無中序遍歷
前序遍歷:根的值在其他所有子節點之前輸出
後序遍歷:根的值在其他所有子節點之後輸出
1、遞迴法(推薦)
class Solution(object):
def preorder(self, root):
res =[]
self.dfs(root, res)
return res
def dfs(self, root, res):
if root:
res.append(root.val) # 後序遍歷就是把這句放到最後
for child in root.children:
self.dfs(child, res)
return res
2、迭代法(瞭解)
# 前序遍歷
class Solution(object):
def preorder(self, root):
if not root: return []
stack, res = [root], []
while stack:
temp = stack.pop()
res.append(temp.val)
stack.extend(temp.children[::-1])
return res
# 後序遍歷 --- 其實還是借用的前序遍歷的思想
class Solution(object):
def postorder(self, root):
if not root: return []
stack, res = [root], []
while stack:
temp = stack.pop()
res.append(temp.val)
stack.extend(temp.children)
return res[::-1]