打卡-算法训练营-Day14 |226.翻转二叉树;101. 对称二叉树;104.二叉树的最大深度;111.二叉树的最小深度

71 阅读2分钟

翻转二叉树

leetcode链接:leetcode.cn/problems/in…

注意:交换的时候是交换指针,不是节点的值

var invertTree = function (root) {
  if (!root) return null;

  let rightNode = root.right;
  root.right = invertTree(root.left);
  root.left = invertTree(rightNode);
  return root;
};

对称二叉树

leetcode链接:leetcode.cn/problems/sy…

检查一棵二叉树是否对称,就是检查左子树的值是否等于右子树的值

存在以下几种情况

  1. 左子树存在,右子树不存在,结果是false
  2. 左子树不存在,右子树不存在,结果是false
  3. 左子树存在,右子树存在,但是值不相等,结果是false
var isSymmetric = function(root) {
    let ans = true
    
    function recursion(leftTree, rightTree) {
        if (leftTree && rightTree) {
            if (leftTree.val === rightTree.val) {
                recursion(leftTree.left, rightTree.right)
                recursion(leftTree.right, rightTree.left)
            } else {
                ans = false
            }
        } else if (leftTree || rightTree) {
            ans = false
        }
    }
    
    recursion(root.left, root.right)
    return ans
};

二叉树的最大深度

leetcode链接:leetcode.cn/problems/ma…

深度:任意一个节点到根节点的距离(从1开始计数)

高度:任意一个节点到叶子节点的距离(从1开始计数)

image.png

求高度是从下往上计数,用后序遍历(左右根),可以将叶子节点的高度返回给父节点,在此基础上加1就是父节点的高度;而求深度用前序遍历

此题的关键是,二叉树根节点的高度就是二叉树的最大深度,所以用后序遍历

var maxDepth = function(root) {
    if (root === null) {
        return 0;
    } else {
        let leftHeight = maxDepth(root.left);
        let rightHeight = maxDepth(root.right);
        return Math.max(leftHeight, rightHeight) + 1;
    }
};

二叉树的最小深度

leetcode链接:leetcode.cn/problems/mi…

如果用二叉树的最大深度的思路做题,会陷入一个误区

当root = [2,null,3,null,4,null,5,null,6],求出来的结果会是1,实际结果是5

题目中对于最小深度的定义是:从根节点到最近叶子节点的最短路径上的节点数量

所以,需要针对左子树为空,右子树不为空,以及左子树不为空,右子树为空的这两种情况特殊处理

var minDepth = function(root) {
    if (root === null) {
        return 0;
    } else {
        let leftHeight = minDepth(root.left);
        let rightHeight = minDepth(root.right);

        if (root.left === null) {
            return 1 + rightHeight;
        }

        if (root.right === null) {
            return 1 + leftHeight;
        }

        return Math.min(leftHeight, rightHeight) + 1;
    }
};