软考
APP下载

二叉树遍历的实现

二叉树(Binary Tree)指的是每个节点最多只有两个子节点的树结构,左子节点和右子节点分别称为左子树和右子树。对于二叉树的遍历就是指按照一定顺序,将树上的每个节点都访问一遍的操作。本文将从二叉树的先序遍历、中序遍历、后序遍历以及层次遍历四个方面来讲解二叉树的遍历实现。

1. 先序遍历

先序遍历是指从根节点开始,依次访问根节点、左子树、右子树的遍历。对于具有根节点的二叉树,先序遍历的代码实现可以使用递归和栈两种方式,其中递归是最常见的实现方式。递归实现代码如下:

```python

def preorder_traversal(root):

if root is None:

return []

result = [root.val]

result += preorder_traversal(root.left)

result += preorder_traversal(root.right)

return result

```

栈实现代码如下:

```python

def preorder_traversal(root):

if root is None:

return []

result = []

stack = [root]

while stack:

node = stack.pop()

result.append(node.val)

if node.right:

stack.append(node.right)

if node.left:

stack.append(node.left)

return result

```

2. 中序遍历

中序遍历是指从根节点开始,依次访问左子树、根节点、右子树的遍历。中序遍历同样可以使用递归和栈两种方式进行实现。递归实现的代码如下:

```python

def inorder_traversal(root):

if root is None:

return []

result = []

result += inorder_traversal(root.left)

result.append(root.val)

result += inorder_traversal(root.right)

return result

```

栈实现的代码如下:

```python

def inorder_traversal(root):

if root is None:

return []

result = []

stack = []

while root or stack:

while root:

stack.append(root)

root = root.left

root = stack.pop()

result.append(root.val)

root = root.right

return result

```

3. 后序遍历

后序遍历是指从根节点开始,依次访问左子树、右子树、根节点的遍历。对于具有根节点的二叉树,后序遍历同样可以使用递归和栈两种方式进行实现。递归实现的代码如下:

```python

def postorder_traversal(root):

if root is None:

return []

result = []

result += postorder_traversal(root.left)

result += postorder_traversal(root.right)

result.append(root.val)

return result

```

栈实现的代码如下:

```python

def postorder_traversal(root):

if root is None:

return []

result = []

stack = [root]

while stack:

node = stack.pop()

if node.left:

stack.append(node.left)

if node.right:

stack.append(node.right)

result.append(node.val)

return result[::-1]

```

4. 层次遍历

层次遍历是指按照树的层级顺序,逐层访问树节点的遍历。层次遍历可以使用队列来进行实现,代码如下:

```python

def levelorder_traversal(root):

if root is None:

return []

result = []

queue = [root]

while queue:

length = len(queue)

res = []

for _ in range(length):

node = queue.pop(0)

res.append(node.val)

if node.left:

queue.append(node.left)

if node.right:

queue.append(node.right)

result.append(res)

return result

```

备考资料 免费领取:软件设计师报考指南+考情分析+思维导图等 立即下载
真题演练 精准解析历年真题,助你高效备考! 立即做题
相关阅读
软件设计师题库