初级算法练习第八节

38 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第22天,点击查看活动详情

1. 引言

接下来继续下一题开展对应leetcode 习题课中初级算法题目的练习,这个就当我的学习笔记了,大家一起交流,让我们一起学习变得更好吧! 官网地址:leetcode.cn/leetbook/re…

2. 题型

  1. 对称二叉树 给你一个二叉树的根节点 root , 检查它是否轴对称。 image
示例 1:

输入:root = [1,2,2,3,4,4,3]
输出:true

image

示例 2:

输入:root = [1,2,2,null,3,null,3]
输出:false


提示:

树中节点数目在范围 [1, 1000] 内
-100 <= Node.val <= 100

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

思路:
首先,此题考查的是二叉树兄弟节点是否对称, 递归法:我们首先确认可以使用递归操作检测每个树子节点。需要比较子树每个节点对称位置是否相同,及左树的左节点和右树的右节点,左树的右节点和右树的左节点是否相同;如果是,接着依次递归操作执行下一层树。如果上述都成立切根节点的值也相同,说明左右两树互为镜像树。 复杂度分析:时间复杂度O(n),每个节点遍历一次。空间复杂度O(n);

迭代法:使用队列,将互为镜像的节点添加如队列中,然后再比较。 复杂度分析:时间复杂度O(n),空间复杂度O(n); 解答:

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {boolean}
 */
// 递归法
var isSymmetric = function(root) {
    if(!root) return true;
    const isMirror = (l, r) => {
        if(!l && !r) return true
        if(l && r
            && l.val == r.val 
            && isMirror(l.left,r.right) 
            && isMirror(l.right,r.left)){
                return true
        }
        return false
    }
    return isMirror(root.left, root.right)

};

// 迭代法

var isSymmetric = function(root) {
    if(!root) return true
    const isMirror = (l, r) => {
        const queue = [l, r]
        while (queue.length){
            const first_step = queue.shift();
            const second_step = queue.shift();
            if(!first_step && !second_step) continue;
            if(!first_step || !second_step) return false;
            if(first_step.val !== second_step.val) return false;
            queue.push(first_step.left, second_step.right);
            queue.push(first_step.right, second_step.left);
            
        }
        retun true
    }
    return isMirror(root.left, root.right)

};