KW51/20刷题总结:使用Python-二叉树——二叉树的锯齿形层次遍历、另一个树的子树

KW51/20:练习二叉树知识,现在总结如下。

第一题:二叉树的锯齿形层次遍历,给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。

  1. 思路:首先想到的是逐层遍历,存下每一层的节点值,然后从左到右存下下一层的节点。根据题目要求,偶数层都是从左到右返回节点值,奇数层都是从右到左返回节点值。代码如下:
class Solution:
    def zigzagLevelOrder(self, root: TreeNode) -> List[List[int]]:
        if not root:
            return []
        
        result = []
        index = 0  # 层的索引
        current_level = [root]  # 保存每一层的节点
        while current_level:  # 逐层遍历,直到为空
            next_level = []
            auxiliary = []  # 辅助列表,用来保存当前层的节点值
            for node in current_level:  # 遍历当前层的每一个节点,将值保存到auxiliary中
                auxiliary.append(node.val)
                if node.left:  # 保存下一层的节点
                    next_level.append(node.left)
                if node.right:
                    next_level.append(node.right)

            if index % 2 == 0:  # 偶数层是从左到右,直接append auxiliary
                result.append(auxiliary)
            else:
                result.append(auxiliary[::-1])  # 奇数层是从右到左,需要将auxiliary逆序后再append

            current_level = next_level
            index += 1
        
        return result

第二题:另一个树的子树,给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。

  1. 思路:首先想到的递归解法,t是s的子树有三种情况,t和s相等,t是s左子树的子树,t是s右子树的子树,递归出口是节点为空。t和s相等也用递归来判断,需要满足t和s的节点值相等并且对应的左右子树也相等,递归出口是节点为空。
    代码如下:
class Solution:
    def isSubtree(self, s: TreeNode, t: TreeNode) -> bool:
		# 判断两个树是否相等,都为空则肯定相等,一个为空一个不为空肯定不相等,
		# 值相等且左右子树相等则两个树叶相等。
        def isEqual(s, t):  
            if s == None and t == None:
                return True
            if s == None or t == None:
                return False
            if s.val == t.val and isEqual(s.left, t.left) and isEqual(s.right, t.right):
                return True

        if s == None:
            return False
        return isEqual(s, t) or self.isSubtree(s.left, t) or self.isSubtree(s.right, t)
        return False

你可能感兴趣的:(二叉树,数据结构,算法,leetcode)