代码随想录系列
上题
思路
二叉树的定义以及三种深度优先遍历方法。。。。反倒是被创建二叉树卡了
代码
递归
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class Solution:
def createTree(self, root: list):
if not root:
return None
n = len(root)
i = 0
result = TreeNode(root[0])
queue = [result]
i += 1
while queue and i < n:
root_node = queue.pop(0)
if i < n and root[i] != 'null':
node = TreeNode(root[i])
root_node.left = node
queue.append(node)
i += 1
if i < n and root[i] != 'null':
node = TreeNode(root[i])
root_node.right = node
queue.append(node)
i += 1
return result
def preOrder(self, root, re):
if root is None:
return
re.append(root.val)
self.preOrder(root.left, re)
self.preOrder(root.right, re)
def inOrder(self, root, re):
if root is None:
return
self.inOrder(root.left, re)
re.append(root.val)
self.inOrder(root.right, re)
def postOrder(self, root, re):
if root is None:
return
self.postOrder(root.left, re)
self.postOrder(root.right, re)
re.append(root.val)
def preorderTraversal(self, root):
por = []
self.preOrder(root, por)
return por
if __name__ == '__main__':
test = Solution()
root = [[1, 2, 3, 4, 5, 6], [1, 'null', 2, 3], [1, 2], [1, 2, 3, 'null', 4]]
for i in root:
tree = test.createTree(i)
print(test.preorderTraversal(tree))
迭代,迭代还是不太理解全,先抄个代码吧
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class Solution:
def createTree(self, root: list):
if not root:
return None
n = len(root)
i = 0
result = TreeNode(root[0])
queue = [result]
i += 1
while queue and i < n:
root_node = queue.pop(0)
if i < n and root[i] != 'null':
node = TreeNode(root[i])
root_node.left = node
queue.append(node)
i += 1
if i < n and root[i] != 'null':
node = TreeNode(root[i])
root_node.right = node
queue.append(node)
i += 1
return result
def preOrder(self, root, re):
if root is None:
return
root = [root]
while root:
node = root.pop()
re.append(node.val)
if node.right:
root.append(node.right)
if node.left:
root.append(node.left)
def inOrder(self, root, re):
# 中序先把左子树入栈,出栈的时候就是从最左下角的结点开始访问
if root is None:
return
pre = []
while pre or root:
if root:
pre.append(root)
root = root.left
else:
root = pre.pop()
re.append(root.val)
root = root.right
def postOrder(self, root, re):
if root is None:
return
root = [root]
while root:
node = root.pop()
re.append(node.val)
if node.left:
root.append(node.left)
if node.right:
root.append(node.right)
# 调用时需要反转
# re = re[::-1]
def preorderTraversal(self, root):
por = []
self.preOrder(root, por)
return por
if __name__ == '__main__':
test = Solution()
root = [[1, 2, 3, 4, 5, 6], [1, 'null', 2, 3], [1, 2], [1, 2, 3, 'null', 4]]
for i in root:
tree = test.createTree(i)
print(test.preorderTraversal(tree))