一文搞定二叉树遍历

Posted 积跬Coder

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一文搞定二叉树遍历相关的知识,希望对你有一定的参考价值。

Brush the topic-BinaryTree

大家好,这是Brush the topic的第一章节,BinaryTree。首先我说一下为什么把这个放在刷题的第一节呢?

原因如下:

  • 培养、训练自己的计算机的思维。

  • 锻炼模版化,抽象化思维

下面让我们一起去完成一个壮举,那就是完全解决二叉树的遍历问题,以及相关问题。are you ok?

知识点回顾

二叉树的遍历

由于对于二叉树的遍历顺序不同,构造出三种不同的遍历方式

  • 前序遍历-根左右

  • 中序遍历-左根右

  • 后序遍历-左右根

递归代码模版如下

Python

 1# Definition for a binary tree node.
2# class TreeNode:
3#     def __init__(self, val=0, left=None, right=None):
4#         self.val = val
5#         self.left = left
6#         self.right = right
7
8# 前序遍历
9def preOreder(self, root):
10  if root:
11    self.traverse_path.append(root.val)
12    preOreder(self.left)
13    preOreder(self.right)
14
15# 中序遍历
16def inOreder(self, root):
17  if root:
18    preOreder(self.left)
19    self.traverse_path.append(root.val)
20    preOreder(self.right)
21
22# 后序遍历
23def postOreder(self, root):
24  if root:
25    preOreder(self.left)
26    preOreder(self.right)
27    self.traverse_path.append(root.val)

Golang

 1// 前序遍历
2func preOreder(root *TreeNode) {
3  result := []int{}
4  if root == nil {return}
5  result  = append(result, root.value)
6  preOreder(root.Left)
7  preOreder(root.Right)
8}
9
10// 中序遍历
11func inOreder(root *TreeNode) {
12  result := []int{}
13  if root == nil {return}
14  preOreder(root.Left)
15  result  = append(result, root.value)
16  preOreder(root.Right)
17}
18
19
20// 后序遍历
21func postOreder(root *TreeNode) {
22  result := []int{}
23  if root == nil {return}
24  postOreder(root.Left)
25  postOreder(root.Right)
26  result  = append(result, root.value)
27}

practice

基于此我们可以拿下以下题目,完全二叉树递归模版解题

144. 二叉树的前序遍历-Python

Recursive

 1# Definition for a binary tree node.
2# class TreeNode:
3#     def __init__(self, val=0, left=None, right=None):
4#         self.val = val
5#         self.left = left
6#         self.right = right
7
8# Recursive-1 
9class Solution:
10    def preorderTraversal(self, root: TreeNode) -> List[int]:
11        result = []
12        self.helper(root, result)
13        return result
14
15    def helper(self, root, result):
16        if root is Nonereturn
17        result.append(root.val)
18        self.helper(root.left,result)
19        self.helper(root.right, result)
20# Recursive-2 Another way Anonymous function
21class Solution:
22    def preorderTraversal(self, root: TreeNode) -> List[int]:
23        def helper(root: TreeNode):
24            if not root: return 
25            res.append(root.val)
26            helper(root.left)
27            helper(root.right)
28
29        res = list()
30        helper(root)
31        return res
32
33# Recursive-3 more clean code
34class Solution:
35    def preorderTraversal(self, root: TreeNode) -> List[int]:
36        if not root:return []
37        res = []
38        res.append(root.val)
39        res+=self.preorderTraversal(root.left)
40        res+=self.preorderTraversal(root.right)
41        return res

Iterative

 1# Definition for a binary tree node.
2# class TreeNode:
3#     def __init__(self, val=0, left=None, right=None):
4#         self.val = val
5#         self.left = left
6#         self.right = right
7
8# Solution-1
9class Solution1:
10    def preorderTraversal(self, root: TreeNode) -> List[int]:
11         stack, result = [], []
12         while stack or root:
13             while root:
14                 # 前序遍历-根左右,先拿根
15                 result.append(root.val)
16                 # 压栈
17                 stack.append(root)
18                 # 拿完根之后拿左儿子
19                 root = root.left
20             # 左儿子拿出来,拿右儿子
21             node = stack.pop()
22             root = node.right
23        # # 完成
24         return result
25
26# Solution-2    简化Solution-1
27class Solution2:
28    def preorderTraversal(self, root: TreeNode) -> List[int]:
29        stack, result = [], []
30        while stack or root:
31            if root:
32                result.append(root.val)
33                stack.append(root)
34                root = root.left
35            else:
36                node = stack.pop()
37                root = node.right
38        return result
39
40# Solution-3
41class Solution3:
42    def preorderTraversal(self, root: TreeNode) -> List[int]:
43        stack, result = [root], []
44        while stack:
45            # 拿出根
46            node = stack.pop()
47            if node:
48                # 前序遍历拿出,先拿根的值                
49                result.append(node.val)
50                # 模仿栈,先入后出。后拿右孩子
51                stack.append(node.right)
52                stack.append(node.left)
53        return result

94. 二叉树的中序遍历-Python

Recursive

 1# Definition for a binary tree node.
2# class TreeNode:
3#     def __init__(self, val=0, left=None, right=None):
4#         self.val = val
5#         self.left = left
6#         self.right = right
7
8# Recursive-1 
9class Solution:
10    def inorderTraversal(self, root: TreeNode) -> List[int]:
11        result = []
12        self.helper(root, result)
13        return result
14
15    def helper(self, root, result):
16        if root is Nonereturn
17        self.helper(root.left,result)
18        result.append(root.val)
19        self.helper(root.right, result)
20
21# Recursive-2 Another way Anonymous function
22class Solution:
23    def inorderTraversal(self, root: TreeNode) -> List[int]:
24        def helper(root: TreeNode):
25            if not root: return 
26            helper(root.left)
27            res.append(root.val)
28            helper(root.right)
29        res = list()
30        helper(root)
31        return res
32
33# Recursive-3 more clean code
34class Solution:
35    def inorderTraversal(self, root: TreeNode) -> List[int]:
36        if not root:return []
37        res = []
38        res+=self.preorderTraversal(root.left)
39        res.append(root.val)
40        res+=self.preorderTraversal(root.right)
41        return res

Iterative

 1# Definition for a binary tree node.
2# class TreeNode:
3#     def __init__(self, val=0, left=None, right=None):
4#         self.val = val
5#         self.left = left
6#         self.right = right
7
8# Solution - 1
9class Solution:
10    def inorderTraversal(self, root: TreeNode) -> List[int]:
11        if not root: return 
12        stack, result = [], []
13        while stack or root:
14            while root:
15                stack.append(root)
16                root = root.left
17            node = stack.pop()
18            result.append(node.val)
19            root = node.right
20        return result
21
22# Solution - 2 简化Solution-1
23class Solution:
24    def inorderTraversal(self, root: TreeNode) -> List[int]:
25        stack, result = [], []
26        while stack or root:
27            if root:
28                stack.append(root)
29                root = root.left
30            else:
31                node = stack.pop()
32                result.append(node.val)
33                root = node.right
34        return result
35
36# Solution - 3
37class Solution2:
38    def inorderTraversal(self, root: TreeNode) -> List[int]:
39        stack, result = [], []
40        while stack or root:
41            if root:
42                stack.append(root)
43                root = root.left
44            else:
45                node = stack.pop()
46                result.append(node.val)
47                root = node.right
48        return result

145. 二叉树的后序遍历

Recursive

 1# Definition for a binary tree node.
2# class TreeNode:
3#     def __init__(self, val=0, left=None, right=None):
4#         self.val = val
5#         self.left = left
6#         self.right = right
7
8# Recursive-1 
9class Solution:
10    def postorderTraversal(self, root: TreeNode) -> List[int]:
11        result = []
12        self.helper(root, result)
13        return result
14
15    def helper(self, root, result):
16        if root is Nonereturn
17        self.helper(root.left,result)
18        self.helper(root.right, result)
19        result.append(root.val)
20
21# Recursive-2 Another way Anonymous function
22class Solution:
23    def postorderTraversal(self, root: TreeNode) -> List[int]:
24        def helper(root: TreeNode):
25            if not root: return 
26            helper(root.left)
27            helper(root.right)
28            res.append(root.val)
29        res = list()
30        helper(root)
31        return res
32
33# Recursive-3 more clean code
34class Solution:
35    def postorderTraversal(self, root: TreeNode) -> List[int]:
36        if not root:return []
37        res = []
38        res+=self.preorderTraversal(root.left)
39        res+=self.preorderTraversal(root.right)
40        res.append(root.val)
41        return res

Iterative

 1# Solution - 1
2class Solution:
3    def postorderTraversal(self, root: TreeNode) -> List[int]:
4        stack, result = [], []
5        while root or stack:
6            while root:
7                result.append(root.val)
8                stack.append(root)
9                root = root.right
10            node = stack.pop()
11            root = node.left
12        return result[::-1]
13
14 # Solution - 2    
15class Solution:
16    def postorderTraversal(self, root: TreeNode) -> List[int]:
17        stack, result = [], []
18        while stack or root:
19            if root:
20                result.append(root.val)
21                stack.append(root)
22                root = root.right
23            else:
24                node = stack.pop()
25                root = node.left
26        return result[::-1]
27
28# Solution - 3
29class Solution:
30    def postorderTraversal(self, root: TreeNode) -> List[int]:
31          if not root: return
32        stack, result = [root], []
33        while stack:
34            node = stack.pop()
35            if node:
36                result.append(node.val)
37                stack.append(node.left)
38                stack.append(node.right)
39        return result[::-1]

二叉树迭代遍历模版-Python

 1# 前序遍历
2# Solution-1
3class Solution1:
4    def preorderTraversal(self, root: TreeNode) -> List[int]:
5        if not root: return
6        stack, result = [], []
7        while root or stack:
8            while root:
9                result.append(root.val)
10                stack.append(root)
11                root = root.left
12            tmp = stack.pop()
13            root = tmp.right
14        return result
15
16# 中序遍历
17class Solution:
18    def inorderTraversal(self, root: TreeNode) -> List[int]:
19        if not root: return 
20        stack, result = [], []
21        while stack or root:
22            while root:
23                stack.append(root)
24                root = root.left
25            node = stack.pop()
26            result.append(node.val)
27            root = node.right
28        return result

由递归到迭代,基本的思想就是由递归中由系统维护的栈,转为手动维护。


以上是关于一文搞定二叉树遍历的主要内容,如果未能解决你的问题,请参考以下文章

一文彻底搞定二叉树的前序中序后序遍历(图解递归非递归)

一文搞定二叉树---由二叉树到贪心算法

数据结构与算法一起搞定面试中的二叉树题目

一文理解二叉树的遍历

牛逼!一文横扫二叉树的所有遍历方法

你还没搞定二叉树遍历吗!(数据结构系列)