Skip to content

Commit 3f118f5

Browse files
committed
debug tree code
1 parent e9bd64d commit 3f118f5

File tree

1 file changed

+118
-0
lines changed
  • docs/19_python内置常用算法和数据结构

1 file changed

+118
-0
lines changed

docs/19_python内置常用算法和数据结构/builtins.md

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,3 +231,121 @@ class Solution(object):
231231
return dfs(root)
232232

233233
```
234+
235+
236+
# leetcode 二叉树调试函数
237+
238+
```py
239+
"""
240+
二叉树树相关问题调试函数
241+
"""
242+
243+
244+
class TreeNode(object): # leetcode tree 节点定义
245+
def __init__(self, val=0, left=None, right=None):
246+
self.val = val
247+
self.left = left
248+
self.right = right
249+
250+
def __str__(self):
251+
return "TreeNode:{} left:{} right:{}".format(self.val, self.left, self.right)
252+
__repr__ = __str__
253+
254+
255+
def gen_tree_from_lc_input(vals_str): # [1,2,3] -> root TreeNode
256+
""" 根据 输入生成一个 tree,返回 root 节点,注意输入字符串
257+
# [450] 删除二叉搜索树中的节点
258+
# https://leetcode-cn.com/problems/delete-node-in-a-bst/description/
259+
# 比如 450 题目单测代码可以这么写
260+
def test():
261+
s = Solution()
262+
root = gen_tree_from_lc_input("[2,1]")
263+
key = 1
264+
res = "[2]"
265+
assert to_lc_tree_str(s.deleteNode(root, key)) == res
266+
"""
267+
import ast
268+
valids = vals_str.replace("null", "None")
269+
vals = ast.literal_eval(valids)
270+
# 以下就是 gen_tree 函数的内容,为了方便单独使用不调用函数了
271+
if not vals:
272+
return None
273+
nodemap = {}
274+
for i in range(len(vals)):
275+
if vals[i] is not None: # 一开始写的 if vals[i],但是 0 节点就错了!!!
276+
nodemap[i] = TreeNode(vals[i])
277+
else:
278+
nodemap[i] = None
279+
280+
root = nodemap[0]
281+
for i in range(len(vals)):
282+
l = 2*i + 1
283+
r = 2*i + 2
284+
cur = nodemap.get(i, None)
285+
left = nodemap.get(l, None)
286+
right = nodemap.get(r, None)
287+
if cur:
288+
cur.left = left
289+
cur.right = right
290+
return root
291+
292+
293+
def to_lc_tree_str(root): # root TreeNode -> [1,2,3,null]
294+
"""返回层序序列化后的树字符串,可以和 leetcode 输出结果比对字符串"""
295+
import json
296+
if not root:
297+
return '[]'
298+
curnodes = [root]
299+
res = [root.val]
300+
while curnodes:
301+
nextnodes = []
302+
for node in curnodes:
303+
if node:
304+
if node.left:
305+
nextnodes.append(node.left)
306+
res.append(node.left.val)
307+
else:
308+
nextnodes.append(None)
309+
res.append(None)
310+
if node.right:
311+
nextnodes.append(node.right)
312+
res.append(node.right.val)
313+
else:
314+
nextnodes.append(None)
315+
res.append(None)
316+
curnodes = nextnodes
317+
318+
while res[-1] is None: # 最后空节点去掉
319+
res.pop()
320+
s = json.dumps(res)
321+
s = s.replace(" ", "")
322+
return s
323+
324+
325+
def gen_tree(vals):
326+
"""
327+
根据层序遍历结果生成二叉树并且返回 root。
328+
把题目中输入 null 换成 None
329+
vals = [1,2,3,None,5]
330+
"""
331+
if not vals:
332+
return None
333+
nodemap = {}
334+
for i in range(len(vals)):
335+
if vals[i]:
336+
nodemap[i] = TreeNode(vals[i])
337+
else:
338+
nodemap[i] = None
339+
340+
root = nodemap[0]
341+
for i in range(len(vals)):
342+
l = 2*i + 1
343+
r = 2*i + 2
344+
cur = nodemap.get(i, None)
345+
left = nodemap.get(l, None)
346+
right = nodemap.get(r, None)
347+
if cur:
348+
cur.left = left
349+
cur.right = right
350+
return root
351+
```

0 commit comments

Comments
 (0)