二叉树遍历(先序、中序、后序、宽度优先遍历)的迭代实现和递归实现;
首先,先定义二叉树类(python3):
class Node:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Tree():
# 树类
def __init__(self):
self.root = Node()
def add(self, data):
# 为树加入节点
node = Node(data)
if self.root.data == -1: # 如果树为空,就对根节点赋值
self.root = node
else:
myQueue = []
treeNode = self.root
myQueue.append(treeNode)
while myQueue: # 对已有的节点进行层次遍历
treeNode = myQueue.pop(0)
if not treeNode.left:
treeNode.left = node
return
elif not treeNode.right:
treeNode.right = node
return
else:
myQueue.append(treeNode.left)
myQueue.append(treeNode.right)
二叉树的遍历分深度优先遍历(DFS)和宽度优先遍历(BFS)。其中深度优先遍历又分为先序遍历,中序遍历,后序遍历。因为二叉树是递归类数据结构,因此大部分关于二叉树的操作都可以通过递归实现。下面将介绍二叉树几种遍历的实现代码以及思路。
先序遍历:
递归实现:
def preorder(root):
if not root:
return
print(root.val)
preorder(root.left)
preorder(root.right)
迭代实现:
def preorder(root):
stack = [root]
while stack:
s = stack.pop()
if s:
print(s.val)
stack.append(s.right)
stack.append(s.left)
中序遍历
递归实现:
def inorder(root):
if not root:
return
inorder(root.left)
print(root.val)
inorder(root.right)
迭代实现:
def inorder(root):
stack = []
while stack or root:
while root:
stack.append(root)
root = root.left
root = stack.pop()
print(root.val)
root = root.right
后序遍历
递归实现:
def postorder(root):
if not root:
return
postorder(root.left)
postorder(root.right)
print(root.val)
迭代实现:
def postorder(root):
stack = []
while stack or root:
while root: # 下行循环,直到找到第一个叶子节点
stack.append(root)
if root.left: # 能左就左,不能左就右
root = root.left
else:
root = root.right
s = stack.pop()
print(s.val)
#如果当前节点是上一节点的左子节点,则遍历右子节点
if stack and s == stack[-1].left:
root = stack[-1].right
else:
root = None
层次遍历
迭代实现:
def BFS(root):
queue = [root]
while queue:
n = len(queue)
for i in range(n):
q = queue.pop(0)
if q:
print(q.val)
queue.append(q.left if q.left else None)
queue.append(q.right if q.right else None)
二叉树的所有路径
根节点到叶子节点的所有路径。
def traverse(node):
if not node.left and not node.right:
return [str(node.val)]
left, right = [], []
if node.left:
left = [str(node.val) + x for x in traverse(node.left)]
if node.right:
right = [str(node.val) + x for x in traverse(node.right)]
return left + right