二叉树(前序,中序,后序,层序)遍历 python实现(递归)

二叉树的遍历是在面试时比较常见的项目了。对于二叉树的前中后层序遍历,每种遍历都可以递归和循环两种实现方法,且每种遍历的递归实现都比循环实现要简洁。下面做一个小结。

一、前序遍历和中序遍历、后序遍历

递归实现的前中后几乎完全一样,改变一下打印的顺序即可:

class Solution:
    def preorderTraversal(self, root):  ##前序遍历
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        if not root:
            return [] 
        return  [root.val] + self.inorderTraversal(root.left) + self.inorderTraversal(root.right)

	def inorderTraversal(self, root):  ##中序遍历
	        """
	        :type root: TreeNode
	        :rtype: List[int]
	        """
	        if not root:
	            return [] 
	        return self.inorderTraversal(root.left) + [root.val] + self.inorderTraversal(root.right)

        
    def postorderTraversal(self, root):  ##后序遍历
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        if not root:
            return [] 
        return  self.inorderTraversal(root.left) + self.inorderTraversal(root.right) + [root.val]

改动的地方只有return时函数的打印顺序。

二、层序遍历

3.1 递归实现
递归函数需要有一个参数level,该参数表示当前结点的层数。遍历的结果返回到一个二维列表sol=[[]]中,sol中的每一个子列表保存了对应index层的从左到右的所有结点value值。

class Solution:
    def levelOrder(self, root):
        """
        :type root: TreeNode
        :rtype: List[List[int]]
        """
        def helper(node, level):
            if not node:
                return
            else:
                sol[level-1].append(node.val)
                if len(sol) == level:  # 遍历到新层时,只有最左边的结点使得等式成立
                    sol.append([])
                helper(node.left, level+1)
                helper(node.right, level+1)
        sol = [[]]
        helper(root, 1)
        return sol[:-1]

PS:

Q:如果仍然按层遍历,但是每层从右往左遍历怎么办呢?

A:将上面的代码left和right互换即可

Q:如果仍然按层遍历,但是我要第一层从左往右,第二层从右往左,第三从左往右…这种zigzag遍历方式如何实现?

A:将sol[level-1].append(node.val)进行一个层数奇偶的判断,一个用append(),一个用insert(0,)

if level%2==1:
    sol[level-1].append(node.val)
else:
    sol[level-1].insert(0, node.val)
发布了99 篇原创文章 · 获赞 6 · 访问量 3991

猜你喜欢

转载自blog.csdn.net/weixin_42247922/article/details/103939766