树是一种常见的数据结构,所有数据结构的基础操作无非三种,数据结构的建立,访问,与修改。对于二叉树结构,主要有二叉树的建立,遍历和重构三种情形。掌握三种情形下常见的代码,遇到具体问题具体分析,对基本方法做局部修改即可满足具体应用的要求。
写在前面!!!
以下分享的代码段均为作者在实际刷题中经常使用到的,不会涉及具体的问题,只包含一些使用频次较高的代码段,同时也会分享一些特殊的方法。这些代码段是我个人经常使用的,但是未必是最高效的。最好的学习方法是复习和总结,这些代码仅作为参考,希望读者在刷题的过程中能够经常复习,多多总结,长期坚持下去算法能力一定能取得长足的进步!算法渣渣一枚,与诸君共勉!由于是纯编辑,未经调试,代码中出现的任何错误希望各位不吝赐教!有更好的实现方法也希望大家能够多多分享,感谢!!!
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
def leverOrder(root):
if not root: return []
res = [[root.val]]; queue = [root]
while queue:
temp = []; values = []
while node in queue:
if node.left:
temp.append(node.left)
values.append(node.left.val)
if node.right:
temp.append(node.right)
values.append(node.right.val)
queue = temp
if values: res.append(values)
return res # 分层存储树节点的值
#递归
def PreOrder(root, res = []):
if root:
res.append(root.val)
PreOrder(root.left, res)
PreOrder(root.right, res)
return res
#迭代
def PreOrder(root):
if not root: return []
res = []
p = root; stack = []
while stack or p:
if p:
stack.append(p)
res.append(p.val)
p = p.left
else:
p = stack.pop()
p = p.right
return res
#递归
def InOrder(root, res = []):
if root:
InOrder(root.left, res)
res.append(root.val)
InOrder(root.right, res)
return res
#迭代
def InOrder(root):
res = []
p = root; stack = []
while stack or p:
if p:
stack.append(p)
p = p.left
else:
p = stack.pop()
res.append(p.val)
p = p.right
return res
#递归
def postOrder(root, res = []):
if root:
postOrder(root.left, res)
postOrder(root.right, res)
res.append(root.val)
#迭代
def postOrder(root):
p = root; stack = []; flag = []
res = []
while p or stack:
if p:
stack.append(p)
flag.append(1)
p = p.right
else:
p = stack.pop()
r = flag.pop()
if r == 1:
stack.append(p)
flag.append(2)
p = p.right
else:
res.append(p.val)
p = None