(Translated by https://www.hiragana.jp/)
davidgao7.github.io/_posts/2021-08-15-binaryTree-Output-Levely.md at master · davidgao7/davidgao7.github.io · GitHub
Skip to content

Latest commit

 

History

History
140 lines (119 loc) · 4.63 KB

2021-08-15-binaryTree-Output-Levely.md

File metadata and controls

140 lines (119 loc) · 4.63 KB
title date permalink tags
Blog Post number 2
2021-08-16
/posts/2021/08/binaryTree-levely-output/
Binary tree
Inorder traversal
LeetCode

こんてんとく要求ようきゅう完成かんせい两道medium/一道いちどうhard,目前もくぜん搞透りょう一道いちどうmedium, さき这道题知识沉よどみいちばんじょうさい卡总结一下今天的收获(估计就偷个懒Crtl C + Crtl V)。

题目描述

给你一个二叉树,要求ようきゅういち层一层get这个二叉树的层序遍历的结果

e.g. Given binary tree: {3,9,20,#,#,15,7}, ざいcodeさとOOPてきTreeらいうつしてき

T = TreeNode(3)
T.left = TreeNode(9)
T.right = TreeNode(20)
T.right.left = TreeNode(15)
T.right.right = TreeNode(7)

Tree图

binary tree example

in order traversal result:

[
  [3],
  [9, 20],
  [15, 7]
]

需要じゅよう注意ちゅういTreeNodeてきてい义,ぼつゆうchildてきじょう况child为None.

题目おもえ

  • 无论なん时都とくあきら顾好base case
    • 如果给的tree结构さといち个node也没ゆうわが们不よう担心什么,直接ちょくせつreturn そら[]
    class Solution:
        def levelOrder(self, root):
          if not root:
            return []
  • これきさきわが们用python list.pop(index=)らい拿到わが们想ようてきcurrent node。 注意ちゅういいち pop() pop(0) いくわ
    • pop() listちゅうさいきさきいち元素げんそ
    • pop(0) listちゅう1st元素げんそ
    >>> a = [1,2,3]
    >>> print(a.pop())
    3
    >>> print(a.pop(0))
    1
    >>>
    

Note: ひら时用ふとしじゅく悉的语言时遇いた确定てき语法以到terminalじょう玩一下当作测试,也节しょうりょうじょう网查找浪费的时间

  • 注意ちゅういappend nodeてき顺序,わが们首さきappend left child しかきさき right child, いん为我们是要求ようきゅう一层一层从左到右存放的
if curnode.left: queue.append(curnode.left)
if curnode.right: queue.append(curnode.right)

这个过程ざいあまね历时さきひだり边的树再みぎ边的。按照题目规定まいprint时要从左往右储存。

问:怎样かい决每层打しるし/储存てき
こたえ:while loopてき发动条件じょうけんqueneさと还有东西(听起らいぞう开反击陷阱...),如果ゆう,就遍历quene长度てき次数じすう
quene就popだい0个, 这个nodeてき保存ほぞん

ざい这一blockわが们专注解ちゅうかい决一层, 连起らいわが们在

length = len(quene)
in_list = []

for _ in range(length):
  curnode = quene.pop(0) # うつりじょだいいち个,いん为是从上往下へん
  in_list.append(curnode.val) # 拿值

  if curnode.left: quene.append(curnode.left) # store left
  if curnode.right: quene.append(curnode.right) # store right

outlist.append(in_list)

くびさき for

for _ in range(length):
  curnode = quene.pop(0) # うつりじょだいいち个,いん为是从上往下へん
  in_list.append(curnode.val) # 拿值

  if curnode.left: quene.append(curnode.left) # store left
  if curnode.right: quene.append(curnode.right) # store right

わが们在嘛?

くびさきloopごといち层nodeてき个数てき次数じすうかり设次すう为N,方便ほうべん引用いんよう),しかきさきpop掉だいいちqueneさとてきnode。还记わが们第一次第一个存的什么吗?root,所以ゆえんわが们第一次就顺利把第一个正确拿下来了。 接着せっちゃくわが们往queneさとそんてきleft child right child。

if curnode.left: quene.append(curnode.left) # store left
if curnode.right: quene.append(curnode.right) # store right

这里わが们先そんleftさいそんright, いん为我们popてき时候さきpopだい0个(left),这样确保りょうわが们永远都从左いたみぎ拿value

さいきさきわが们把这一层放到总listさと

out_list.append(in_list)

组合おこりらい

length = len(quene)
in_list = []
for _ in range(length):
    curnode = quene.pop(0)  # (だま认移じょれつひょうさいきさきいち元素げんそ)这里需要じゅよううつりじょ队列さい头上てき
    in_list.append(curnode.val) # 1st get left val, then got right val: [level0:l, level1:l,r, level2:l,r...]
    if curnode.left: quene.append(curnode.left) # first store left then right, same with in order
    if curnode.right: quene.append(curnode.right)
out_list.append(in_list)

层序へん历逻辑结たばりょう么如なん确定ほどじょ结束条件じょうけん呢?
こたえざいpythonさととう[]そらてき直接ちょくせつ退出たいしゅつloop(真方まがた便びん。。)

接着せっちゃく就得いたあまね历结はてりょう

类似题目

  • [102] 二叉树的层序遍历
  • [107] 二叉树的层次遍历II
  • [199] 二叉树的右视图
  • [637] 二叉树的层平均值
  • [429] Nまた树的ぜんじょへん
  • [515] ざいまい个树ぎょうちゅう最大さいだい
  • [116] はまたかしまい个节てんてき一个右侧节点指针
  • [117] はまたかしまい个节てんてき一个右侧节点指针II
  • [104] また树的最大さいだい深度しんど
  • [111] また树的最小さいしょう深度しんど

按类ぶん题,いちどおり