Leetcode學習day1(二叉樹遍歷)

python3 參考這篇題解:二叉樹遍歷https://leetcode-cn.com/problems/binary-tree-preorder-traversal/solution/tu-jie-er-cha-shu-de-si-chong-bian-li-by-z1m/

前序遍歷:根->左->右

LeetCode?144.二叉樹的前序遍歷

迭代解法:(借助棧)

class?Solution:

????def?preorderTraversal(self,?root:?TreeNode)?->?List[int]:

????????if?not?root:?return?[]

????????stack,?res=[root],?[]

????????while?stack:

????????????node=stack.pop()

????????????if?node:

????????????????res.append(node.val)

????????????????if?node.right:

????????????????????stack.append(node.right)

????????????????if?node.left:

????????????????????stack.append(node.left)

????????return?res

遞歸解法:

class?Solution:

????def?preorderTraversal(self,?root:?TreeNode)?->?List[int]:

????????res=[]

????????def?preorder(root):

????????????nonlocal?res

????????????if?not?root:

????????????????return

????????????res.append(root.val)

????????????preorder(root.left)

????????????preorder(root.right)

????????preorder(root)

????????return?res



中序遍歷:左->根->右

Leetcode?94. 二叉樹的中序遍歷

遞歸解法:

class?Solution:

????def?inorderTraversal(self,?root:?TreeNode)?->?List[int]:

????????if?not?root:?return?[]

????????stack,?res=?[(0,root)],?[]


????????while?stack:

????????????flag,?node=stack.pop()

????????????if?not?node:?continue

????????????if?flag==1:?res.append(node.val)

????????????else:

????????????????stack.append((0,node.right))

????????????????stack.append((1,node))

????????????????stack.append((0,node.left))

????????return?res

遞歸解法:

class?Solution:

????def?inorderTraversal(self,?root:?TreeNode)?->?List[int]:

????????res=[]

????????def?inorder(root):

????????????nonlocal?res

????????????if?not?root:

???????????????return

????????????inorder(root.left)

????????????res.append(root.val)

????????????inorder(root.right)

????????inorder(root)

????????return?res



后序遍歷:左->右->根

Leetcode?145. 二叉樹的后序遍歷

迭代解法:

class?Solution:

????def?postorderTraversal(self,?root:?TreeNode)?->?List[int]:

????????if?not?root:?return?[]

????????stack,?res=?[(0,root)],?[]

????????while?stack:

????????????flag,?node=stack.pop()

????????????if?not?node:?continue

????????????if?flag==1:?res.append(node.val)

????????????else:

????????????????stack.append((1,node))

????????????????stack.append((0,node.right))

????????????????stack.append((0,node.left))

????????return?res

遞歸解法:

class?Solution:

????def?postorderTraversal(self,?root:?TreeNode)?->?List[int]:

????????res=?[]

????????def?postorder(root):

????????????nonlocal?res

????????????if?not?root:

????????????????return

????????????postorder(root.left)

????????????postorder(root.right)

????????????res.append(root.val)

????????postorder(root)

????????return?res



層序遍歷:廣度優(yōu)先算法,用隊列

Leetcode102. 二叉樹的層序遍歷

class?Solution:

????def?levelOrder(self,?root:?TreeNode)?->?List[List[int]]:

????????if?not?root:?return?[]

????????res,?q=?[],?[root]

????????while?q:

????????????level=[]

????????????n=?len(q)

????????????for?i?in?range(n):

????????????????node=q.pop(0)

????????????????level.append(node.val)

????????????????if?node.left:

????????????????????q.append(node.left)

????????????????if?node.right:

????????????????????q.append(node.right)

????????????res.append(level)

????????return?res



偽碼:


遞歸解法


迭代解法
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容