欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python实现二叉树的层序、前序、中序、后序、之字形遍历

程序员文章站 2022-07-02 22:29:43
python实现二叉树的层序、前序、中序、后序遍历1.示例 二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 72.层序遍历要求:从上到下打印二叉树,同层节点按照从左往右的顺序打印这个版本是leetcode精选题解这个版本是leetcode精选题解# Definition for a binary tree node.# class TreeNode(object):# def __in...

python实现二叉树的层序、前序、中序、后序遍历

1.示例

    二叉树: [3,9,20,null,null,15,7],
    3
   / \
  9  20
    /  \
   15   7

—————————————————————————
树的遍历方式总体分为两类:深度优先搜索(DFS)、广度优先搜索(BFS):
常见的 DFS : 先序遍历、中序遍历、后序遍历(递归法);
常见的 BFS : 层序遍历(即按层遍历,迭代法)。

2.层序遍历

要求:从上到下打印二叉树,同层节点按照从左往右的顺序打印,即树的广度优先搜索(BFS)。
思路:运用队列结构的思想,将同一层的节点加到队列中,每次在结果集中追加同一层节点的val。

这个版本是leetcode精选题解。使用 collections 中的双端队列 deque() ,其 popleft() 方法可达到 O(1) 时间复杂度;列表 list 的 pop(0) 方法时间复杂度为 O(N),弹出队列的首元素。
(队列特点:先进先出)

双端队列:queue = collections.deque()
		 head_node = queue.popleft()
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution(object):
    def levelOrder(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        if not root: 
            return []
        res, queue = [], collections.deque()
        queue.append(root)
        while queue:
            node = queue.popleft()
            res.append(node.val)
            if node.left: queue.append(node.left)
            if node.right: queue.append(node.right)
        return res

这个版本是小鸟版,使用pop()方法来弹出队列元素。

pop()方法:参见  目录8:相关知识
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def levelOrder(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        # 利用队列,层次遍历二叉树,打印
        que = []
        result = []
        if not root:
            return []
        que.append(root)
        while que:
            node = que.pop(0)
            result.append(node.val)
            if node.left:
                que.append(node.left)
            if node.right:
                que.append(node.right)
        return result

3.前序遍历

前序遍历的特点:根节点、左节点、右节点
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution(object):
	def Solution(self,root):
		result = []
		def preOrder(root):
			if not root:
				return 
			result.append(root.val)
			# 遍历左子树
			preOrder(root.left)
			# 遍历右子树
			preOrder(root.right)
		preOrder(root)
		return result

4.中序遍历

中序遍历的特点:左节点、根节点、右节点
反向中序遍历的特点:右节点、根节点、左节点
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution(object):
# 中序遍历
	def Solution(self,root):
		result = []
		def midOrder(root):
		    if not root: return
		    dfs(root.left)  # 左
		    result.append(root.val) # 根
		    dfs(root.right) # 右
		midOrder(root)
		return result
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution(object):
# 反序中序遍历
	def Solution(self,root):
		result = []
		def midOrder(root):
		    if not root: return
		    dfs(root.right)  # 左
		    result.append(root.val) # 根
		    dfs(root.left) # 右
		midOrder(root)
		return result

5.后序遍历

后序遍历的特点:左节点、右节点、根节点
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution(object):
# 后序遍历
	def Solution(self,root):
		result = []
        def postOrder(root):
            if not root:
                return 
            postOrder(root.left)
            postOrder(root.right)
            result.append(root.val)
        postOrder(root)
        print(result)
        return result

6.之字形遍历

之字形遍历,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
奇数层正序打印该层,偶数层反序打印该层,所以需要判断当前层是奇数层还是偶数层。

这个版本是leetcode精选题解。运用队列思想,偶数层则追加队列头部,奇数层则追加队列尾部。

class Solution:
    def levelOrder(self, root: TreeNode) -> List[List[int]]:
        if not root: return []
        res, deque = [], collections.deque([root])
        while deque:
            tmp = collections.deque()
            for _ in range(len(deque)):
                node = deque.popleft()
                if len(res) % 2: tmp.appendleft(node.val) 
                # 偶数层 -> 队列头部
                else: tmp.append(node.val) 
                # 奇数层 -> 队列尾部
                if node.left: deque.append(node.left)
                if node.right: deque.append(node.right)
            res.append(list(tmp))
        return res

小鸟版

def levelOrder(self, root):
        # 之字形打印二叉树
        # 奇数层正序打印该层,偶数层反序打印该层
        result = []
        def deal(root):
            if not root:
                return []
            que = []
            que.append(root)
            while que:
                tmp = []
                for i in range(len(que)):
                    node = que.pop(0)
                    # 偶数层
                    if len(result)%2:
                        tmp.insert(0,node.val)
                    # 奇数层
                    else:
                        tmp.append(node.val)
                    if node.left:
                        que.append(node.left)
                    if node.right:
                        que.append(node.right)
                result.append(list(tmp))
        deal(root)
        return result

7.python之队列学习

可以参考博文:
队列:https://blog.csdn.net/qq_40576653/article/details/110749145

8.相关知识

博文涉及到的python相关知识可以参考以下博文:

  • python中List列表函数pop():
    pop(parm)-----
    • 作用:移除列表中的一个元素(默认最后一个元素),并且返回该元素的值。
    • 参数为可选参数,参数值为列表的索引值,0<=index<=len(list)-1
  • python中的队列
    • 参见 目录7.python之队列学习

9.参考链接

参考1:https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-ii-lcof/solution/mian-shi-ti-32-ii-cong-shang-dao-xia-da-yin-er-c-5/
参考2:https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-iii-lcof/solution/mian-shi-ti-32-iii-cong-shang-dao-xia-da-yin-er–3/

本文地址:https://blog.csdn.net/qq_40576653/article/details/110246785