@@ -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