feat(leetcode; utils): 94.二叉树的中序遍历
94.二叉树的中序遍历 Signed-off-by: Ching <loooching@gmail.com>
This commit is contained in:
parent
091b0e8792
commit
b447d032a7
2
.gitignore
vendored
2
.gitignore
vendored
@ -86,7 +86,7 @@ ipython_config.py
|
||||
# pyenv
|
||||
# For a library or package, you might want to ignore these files since the code is
|
||||
# intended to run in multiple environments; otherwise, check them in:
|
||||
# .python-version
|
||||
.python-version
|
||||
|
||||
# pipenv
|
||||
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
||||
|
||||
15
.vscode/launch.json
vendored
Normal file
15
.vscode/launch.json
vendored
Normal file
@ -0,0 +1,15 @@
|
||||
{
|
||||
// 使用 IntelliSense 了解相关属性。
|
||||
// 悬停以查看现有属性的描述。
|
||||
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"name": "Python: 当前文件",
|
||||
"type": "python",
|
||||
"request": "launch",
|
||||
"program": "${file}",
|
||||
"console": "integratedTerminal"
|
||||
}
|
||||
]
|
||||
}
|
||||
17
.vscode/settings.json
vendored
Normal file
17
.vscode/settings.json
vendored
Normal file
@ -0,0 +1,17 @@
|
||||
{
|
||||
"python.formatting.provider": "black",
|
||||
"python.formatting.blackArgs": [
|
||||
"-S",
|
||||
"-C",
|
||||
"-l 120"
|
||||
],
|
||||
"editor.formatOnPaste": true,
|
||||
"editor.formatOnSave": true,
|
||||
"editor.rulers": [
|
||||
120
|
||||
],
|
||||
"editor.bracketPairColorization.enabled": true,
|
||||
"editor.guides.bracketPairs": "active",
|
||||
"vetur.format.options.tabSize": 4,
|
||||
"vetur.format.enable": false
|
||||
}
|
||||
57
94.二叉树的中序遍历.py
Normal file
57
94.二叉树的中序遍历.py
Normal file
@ -0,0 +1,57 @@
|
||||
#
|
||||
# @lc app=leetcode.cn id=94 lang=python3
|
||||
#
|
||||
# [94] 二叉树的中序遍历
|
||||
#
|
||||
# 中序遍历(LDR)是二叉树遍历的一种,也叫做中根遍历、中序周游。在二叉树中,
|
||||
# 中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树。
|
||||
|
||||
# @lc code=start
|
||||
# Definition for a binary tree node.
|
||||
# class TreeNode:
|
||||
# def __init__(self, val=0, left=None, right=None):
|
||||
# self.val = val
|
||||
# self.left = left
|
||||
# self.right = right
|
||||
|
||||
from typing import Optional, List
|
||||
|
||||
from utils import *
|
||||
|
||||
|
||||
class Solution:
|
||||
def inorderTraversal(self, root: TreeNode) -> List[int]:
|
||||
res = []
|
||||
stack = []
|
||||
if root:
|
||||
stack.append(root)
|
||||
while stack:
|
||||
node = stack[-1]
|
||||
if node:
|
||||
# 将该节点弹出,避免重复操作,下面再将右中左节点添加到栈中
|
||||
stack.pop()
|
||||
# 添加右节点(空节点不入栈)
|
||||
if node.right:
|
||||
stack.append(node.right)
|
||||
# 添加中节点
|
||||
stack.append(node)
|
||||
# 中节点访问过,但是还没有处理,加入空节点作为标记
|
||||
stack.append(None)
|
||||
# 添加左节点(空节点不入栈)
|
||||
if node.left:
|
||||
stack.append(node.left)
|
||||
else: # 只有在遇到空节点的时候,才将下一个节点放进结果集中
|
||||
# 将空节点弹出
|
||||
stack.pop()
|
||||
# 重新取出栈中元素
|
||||
node = stack.pop()
|
||||
res.append(node.val)
|
||||
return res
|
||||
|
||||
|
||||
s = Solution()
|
||||
root = creatBTree([1, None, 2], 0)
|
||||
s.inorderTraversal(root)
|
||||
|
||||
|
||||
# @lc code=end
|
||||
63
utils/__init__.py
Normal file
63
utils/__init__.py
Normal file
@ -0,0 +1,63 @@
|
||||
# -*- coding: UTF-8 -*-
|
||||
|
||||
|
||||
class TreeNode(object):
|
||||
def __init__(self, x):
|
||||
self.val = x
|
||||
self.left = None
|
||||
self.right = None
|
||||
|
||||
def __repr__(self):
|
||||
return 'node %s' % self.val
|
||||
|
||||
|
||||
def creatBTree(data, index):
|
||||
"""通过数组生成二叉树
|
||||
|
||||
Args:
|
||||
data ([int, None]): 每个节点都要定义,包括空节点 eg. [1,None,2, None, None, 3]
|
||||
index (int): 返回哪个位置的节点
|
||||
|
||||
Returns:
|
||||
TreeNode: TreeNode obj
|
||||
"""
|
||||
pNode = None
|
||||
if index < len(data):
|
||||
if data[index] == None:
|
||||
return
|
||||
pNode = TreeNode(data[index])
|
||||
pNode.left = creatBTree(data, 2 * index + 1) # [1, 3, 7, 15, ...]
|
||||
pNode.right = creatBTree(data, 2 * index + 2) # [2, 5, 12, 25, ...]
|
||||
return pNode
|
||||
|
||||
|
||||
def generate_tree(vals):
|
||||
"""通过 leetcode 样式的数组生成二叉树
|
||||
|
||||
Args:
|
||||
vals ([int, None]): leetcode 格式,省略全空子节点 eg. [1, None, 2, 3]
|
||||
|
||||
Returns:
|
||||
TreeNode: TreeNode obj
|
||||
"""
|
||||
if not vals:
|
||||
return None
|
||||
que = []
|
||||
fill_left = True
|
||||
for val in vals:
|
||||
node = TreeNode(val) if val else None
|
||||
if len(que) == 0:
|
||||
root = node
|
||||
que.append(node)
|
||||
elif fill_left:
|
||||
que[0].left = node
|
||||
fill_left = False
|
||||
if node:
|
||||
que.append(node)
|
||||
else:
|
||||
que[0].right = node
|
||||
if node:
|
||||
que.append(node)
|
||||
que.pop(0)
|
||||
fill_left = True
|
||||
return root
|
||||
Loading…
x
Reference in New Issue
Block a user