日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

算法(14)-leetcode-explore-learn-数据结构-二叉树的遍历

發(fā)布時(shí)間:2023/12/13 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法(14)-leetcode-explore-learn-数据结构-二叉树的遍历 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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):

class TreeNode(object):def __init__(self, x):self.val = xself.left = Noneself.right = None

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 res

1.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 res

1.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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。