算法(14)-leetcode-explore-learn-数据结构-二叉树的遍历
leetcode-explore-learn-數(shù)據(jù)結(jié)構(gòu)-二叉樹(shù)1
- 1.二叉樹(shù)的深度優(yōu)先遍歷
- 1.1前序遍歷:中左右
- 1.2中序遍歷:左中右
- 1.3后序遍歷:左右中
- 2.二叉樹(shù)的廣度優(yōu)先遍歷
本系列博文為leetcode-explore-learn子欄目學(xué)習(xí)筆記,如有不詳之處,請(qǐng)參考leetcode官網(wǎng):https://leetcode-cn.com/explore/learn/card/data-structure-binary-tree/2/traverse-a-tree/7/
所有例題的編程語(yǔ)言為python
二叉樹(shù)節(jié)點(diǎn)結(jié)構(gòu):
1.二叉樹(shù)的深度優(yōu)先遍歷
二叉樹(shù)的深度優(yōu)先的三種遍歷方式:這個(gè)序就是根節(jié)點(diǎn)在什么時(shí)候遍歷
1.1前序遍歷:中左右
遞歸的框架有了,如何在res list中加入答案,在內(nèi)層再定義一個(gè)函數(shù),
class Solution(object):def preorderTraversal(self, root):""":type root: TreeNode:rtype: List[int]"""res=[]def dfs_pre(node):if node==None:returnres.append(node.val)dfs_pre(node.left)dfs_pre(node.right)dfs_pre(root)return res迭代的框架:當(dāng)前節(jié)點(diǎn)的右子樹(shù)放入堆棧,存起來(lái)。將當(dāng)前節(jié)點(diǎn)的值放入res,當(dāng)前節(jié)點(diǎn)更新為當(dāng)前節(jié)點(diǎn)的左子樹(shù)節(jié)點(diǎn)。
class Solution(object):def preorderTraversal(self, root):""":type root: TreeNode:rtype: List[int]"""stack=[]res=[]node=rootwhile(node or stack):if node:res.append(node.val)if node.right:stack.append(node.right)node=node.leftelse:node=stack.pop()return res1.2中序遍歷:左中右
遞歸的框架和先序遍歷一樣。
class Solution(object):def inorderTraversal(self, root):""":type root: TreeNode:rtype: List[int]"""res=[]def dfs_inorder(node):if node==None:returndfs_inorder(node.left)res.append(node.val)dfs_inorder(node.right)dfs_inorder(root)return res迭代框架:需要將什么放stack中呢,根節(jié)點(diǎn)一路向左遍歷到底部。將根節(jié)點(diǎn)都放進(jìn)去,放進(jìn)去的就是有的節(jié)點(diǎn)。遍歷到底端之后,逐個(gè)彈出;然后去該節(jié)點(diǎn)的右子樹(shù),如果右子樹(shù)為空,就會(huì)彈該節(jié)點(diǎn)的父親節(jié)點(diǎn);如果右子樹(shù)不為空,就可以迭代進(jìn)去處理右子樹(shù)。
class Solution(object):def inorderTraversal(self, root):""":type root: TreeNode:rtype: List[int]"""stack=[]res=[]node=rootwhile(stack or node):if node:stack.append(node)node=node.leftelse:node=stack.pop()res.append(node.val)node=node.rightreturn res1.3后序遍歷:左右中
遞歸的框架和先序,中序遍歷一致
class Solution(object):def postorderTraversal(self, root):""":type root: TreeNode:rtype: List[int]"""res=[]def dfs_post(node):if node==None:returndfs_post(node.left)dfs_post(node.right)res.append(node.val)dfs_post(root)return res迭代的框架:中右左的逆序,就是左右中。在偽前序遍歷(保存左節(jié)點(diǎn))的結(jié)果下,逆序輸出即可。
class Solution(object):def postorderTraversal(self, root):""":type root: TreeNode:rtype: List[int]"""stack=[]res=[]node=rootwhile(stack or node):if node:res.append(node.val)if node.left:stack.append(node.left)node=node.rightelse:node=stack.pop()return res[::-1]2.二叉樹(shù)的廣度優(yōu)先遍歷
–層次遍歷,用隊(duì)列來(lái)幫助實(shí)現(xiàn)廣度優(yōu)先遍歷
遞歸框架: 需要有一個(gè)level信息用于存儲(chǔ)該節(jié)點(diǎn)所處的層次。問(wèn)題:在哪里新增res的層次呢–解決方案,先判斷l(xiāng)層次是否存在,不在的話(huà)新增。
class Solution(object):def levelOrder(self, root):""":type root: TreeNode:rtype: List[List[int]]"""if root==None:return []res=[]def bfs(node,l):if node==None:returnif l>len(res)-1:res.append([])res[l].append(node.val)bfs(node.left,l+1)bfs(node.right,l+1)bfs(root,0)return res迭代框架:隊(duì)列,先進(jìn)先出,每層先統(tǒng)計(jì)隊(duì)列的長(zhǎng)度,確認(rèn)要彈出的元素個(gè)數(shù)。
class Solution(object):def levelOrder(self, root):""":type root: TreeNode:rtype: List[List[int]]"""if root==None:return []que=[root]res=[]l=0while(que):n=len(que)res.append([])for i in range(n):node=que.pop(0)res[l].append(node.val)if node.left:que.append(node.left)if node.right:que.append(node.right)l+=1return res總結(jié)
以上是生活随笔為你收集整理的算法(14)-leetcode-explore-learn-数据结构-二叉树的遍历的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: c++基础学习(03)--(存储类,运算
- 下一篇: 如何使用github中的pull req