DAY 15 | 102. Binary Tree Level Order Traversal | 226. Invert Binary Tree | 101. Symmetric Tree

102. Binary Tree Level Order Traversal 

Iteration:

class Solution:
    def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
        results = []
        if not root:
            return
        
        que = deque([root])

        while que:
            size = len(que)
            result = []
            for _ in range(size):
                cur = que.popleft()
                result.append(cur.val)
                if cur.left:
                    que.append(cur.left)
                if cur.right:
                    que.append(cur.right)
            results.append(result)
        
        return results

226. Invert Binary Tree

post order:

class Solution:
    def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        
        def traversal(node):
            if node is None:
                return
            
            traversal(node.left)
            traversal(node.right)
            node.left, node.right = node.right, node.left
        
        traversal(root)
        
        return root

using level traversal:

class Solution:
    def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        if not root:
            return root

        que = deque([root])

        while(que):
            size = len(que)
            for i in range(size):
                node = que.popleft()
                node.left, node.right = node.right, node.left
                if node.left:
                    que.append(node.left)
                if node.right:
                    que.append(node.right)
        
        return root

101. Symmetric Tree

recursion 3 steps:

1. parameters: left and right

2. when to stop: conditions when handling none or can tell it's immediatly not equal

3. the logic of a single layer: compare the inner pair and the outer pair

class Solution:
    def isSymmetric(self, root: Optional[TreeNode]) -> bool:

        def compare(left, right):
            if left == None and right != None:
                return False
            if left != None and right == None:
                return False
            if left == None and right == None:
                return True
            if left.val != right.val:
                return False
            
            outside_compare = compare(left.left, right.right)
            inside_compare = compare(left.right, right.left)
            return outside_compare and inside_compare
    
        return compare(root.left, root.right)

Using a queue:

comparing the outer pairs in depth and then compare the inner pairs in depth.

we can change the queue into a stack. this will only change the traversal order: from inner pairs to outer pairs.

class Solution:
    def isSymmetric(self, root: Optional[TreeNode]) -> bool:
        if not root:
            return True

        que = deque([])
        que.append(root.left)
        que.append(root.right)

        while(que):
        
            left = que.popleft()
            right = que.popleft()

            if not left and not right:
                continue
            if not left and right:
                return False
            if left and not right:
                return False
            if left.val != right.val:
                return False
            
            que.append(left.right)
            que.append(right.left)
            que.append(left.left)
            que.append(right.right)
        
        return True

using level traversal: not very efficient because there're two for loops in each while loop. 

class Solution:
    def isSymmetric(self, root: Optional[TreeNode]) -> bool:
        if not root:
            return True

        que = [root]
        while que:
            this_level_length = len(que)
            for i in range(this_level_length // 2):
                # 要么其中一个是None但另外一个不是
                if (not que[i] and que[this_level_length - 1 - i]) or (que[i] and not que[this_level_length - 1 - i]):
                    return False
                # 要么两个都不是None
                if que[i] and que[i].val != que[this_level_length - 1 - i].val:
                    return False
            for i in range(this_level_length):
                if not que[i]: continue
                que.append(que[i].left)
                que.append(que[i].right)
            que = que[this_level_length:]
        return True

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值