zoukankan      html  css  js  c++  java
  • 0101对称二叉树 Marathon

    给定一个二叉树,检查它是否是镜像对称的。
    例如,二叉树 [1,2,2,3,4,4,3] 是对称的。

    但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:

    进阶:
    你可以运用递归和迭代两种方法解决这个问题吗?

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/symmetric-tree

    python

    # 0101.对称二叉树
    class Solution:
        def isSymmetric(self, root: TreeNode) -> bool:
            if not root:
                return True
            return self.compare(root.left, root.right)
    
        # 递归法
        def compare(self, left, right):
            # 1.处理空节点的情况
            if left == None and right != None:
                return False
            elif left != None and right == None:
                return False
            elif left == None and right == None:
                return True
    
            # 2.处理数值不等的情况
            elif left.val != right.val:
                return False
    
            # 3.左右节点非空且数值相同,递归做下一层的判断
            # 外侧节点是否相等
            outside = self.compare(left.left, right.right)
            # 内侧节点是否相等
            inside = self.compare(left.right, right.left)
            # 左子树中,右子树中,逻辑处理
            isSame = outside and inside
    
            return isSame
    
    # 迭代法-使用队列
    class Solution1:
        def isSymmetric(self, root: TreeNode) -> bool:
            if not root:
                return True
    
            from collections import deque
            queue = deque()
            queue.append(root.left)
            queue.append(root.right)
            # 两树是否相互翻转
            while queue:
                leftNode = queue.popleft()
                rightNode = queue.popleft()
                # 两节点空,对称
                if not leftNode and not rightNode:
                    continue
                # 左右节点有空节点或者节点值不等时,直接返回Fasle
                if not leftNode or not rightNode or leftNode.val != rightNode.val:
                    return False
                # 处理对称下的遍历翻转
                # 左子树左孩子-右子树的右孩子 && 左子树右孩子-右子树的左孩子
                queue.append(leftNode.left)
                queue.append(rightNode.right)
                queue.append(leftNode.right)
                queue.append(rightNode.left)
            return True
    
    

    golang

    package binaryTree
    
    // 递归
    func defs(left, right *TreeNode) bool {
    	// 两节点空->true && 有空节点->false && 值不等的-> false
    	if left == nil && right == nil {
    		return true
    	}
    	if left == nil || right == nil {
    		return false
    	}
    	if left.Val != right.Val {
    		return false
    	}
    	// 左子树左节点-右子树右节点 && 左子树右节点&右子树左节点
    	return defs(left.Left, right.Right) && defs(left.Right, right.Left)
    }
    
    func isSymmetric(root *TreeNode) bool {
    	return defs(root.Left, root.Right)
    }
    
    // 迭代
    func isSymmetric2(root *TreeNode) bool {
    	var queue []*TreeNode
    	if root != nil {
    		queue = append(queue, root.Left, root.Right)
    	}
    	for len(queue) > 0 {
    		left := queue[0]
    		right := queue[1]
    		queue = queue[2:]
    		if left == nil && right == nil {
    			continue
    		}
    		if left == nil || right == nil || left.Val != right.Val {
    			return false
    		}
    		queue = append(queue, left.Left, right.Right, right.Left, left.Right)
    	}
    	return true
    }
    
    
  • 相关阅读:
    冲刺周期会议三
    冲刺周期会议二
    冲刺周期会议一
    日常会议
    总结会议及站立会议(六)
    站立会议(五)
    站立会议(四)
    【自习任我行】
    软件小创意
    团队项目题目拟定
  • 原文地址:https://www.cnblogs.com/davis12/p/15552333.html
Copyright © 2011-2022 走看看