代码随想录算法训练营第十五天 | 102. 二叉树的层序遍历 226. 翻转二叉树 101. 对称二叉树

50 阅读4分钟

102. 二叉树的层序遍历

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。

 

示例 1:

输入: root = [3,9,20,null,null,15,7]
输出: [[3],[9,20],[15,7]]

示例 2:

输入: root = [1]
输出: [[1]]

示例 3:

输入: root = []
输出: []

 

提示:

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

迭代:

/**
 * 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 {number[][]}
 */
var levelOrder = function(root) {
    let queue = [];
    let res = [];

    if (!root) return res;

    queue.push(root);

    while(queue.length) {
        let vec = [];
        let size = queue.length;

        for(let i = 0; i < size; i++) {
            let top = queue.shift();
            vec.push(top.val);
            if (top.left) queue.push(top.left);
            if (top.right) queue.push(top.right);
        }

        res.push(vec);
    }

    return res;
};

递归:

/**
 * 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 {number[][]}
 */
var levelOrder = function(root) {
    let res = [];

    function order(cur, depth) {
        if (!cur) return;
        if (res.length === depth) {
            res.push([]);
        }

        res[depth].push(cur.val);

        order(cur.left, depth + 1);
        order(cur.right, depth + 1)
    }

    order(root, 0);

    return res;
};

107. 二叉树的层序遍历 II

把顺序倒一下即可。

/**
 * 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 {number[][]}
 */
var levelOrderBottom = function(root) {
    let res = [];
    let queue = [];

    if (!root) return res;

    queue.push(root);

    while(queue.length) {
        let len = queue.length;
        let arr = [];
        for (let i = 0; i < len; i++) {
            let top = queue.shift();
            arr.push(top.val);
            if (top.left) queue.push(top.left);
            if (top.right) queue.push(top.right);
        }

        res.unshift(arr);
    }

    return res;
};

199. 二叉树的右视图

/**
 * 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 {number[]}
 */
var rightSideView = function(root) {
    let res = [];
    let queue = [];

    if (!root) return res;

    queue.push(root);

    while(queue.length) {
        let len = queue.length;
        let arr = [];

        for (let i = 0; i < len; i++) {
            let top = queue.shift();
            if (i === len - 1) {
                arr.push(top.val);
            }

            if (top.left) queue.push(top.left);
            if (top.right) queue.push(top.right);
        }

        res.push(arr);
    }

    return res;
};

637. 二叉树的层平均值

/**
 * 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 {number[]}
 */
var averageOfLevels = function(root) {
    let res = [];
    let queue = [];

    if (!root) return res;

    queue.push(root);

    while(queue.length) {
        let len = queue.length;
        let sum = 0;

        for (let i = 0; i < len; i++) {
            let top = queue.shift();
            sum += top.val;

            if (top.left) queue.push(top.left);
            if (top.right) queue.push(top.right);
        }
        const avg = sum / len;
        res.push(avg);
    }

    return res;
};

429. N 叉树的层序遍历

/**
 * // Definition for a Node.
 * function Node(val,children) {
 *    this.val = val;
 *    this.children = children;
 * };
 */

/**
 * @param {Node|null} root
 * @return {number[][]}
 */
var levelOrder = function(root) {
    let res = [];
    if (!root) return res;

    let queue = [root];

    while(queue.length) {
        let len = queue.length;
        let arr = [];

        for (let i = 0; i < len; i++) {
            let top = queue.shift();
            arr.push(top.val);
            let size = top.children.length;

            for (let j = 0; j < size; j++) {
                queue.push(top.children[j]);
            }
        }

        res.push(arr);
    }

    return res;
};

515. 在每个树行中找最大值

/**
 * 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 {number[]}
 */
var largestValues = function(root) {
    let res = [];
    if (!root) return res;

    let queue = [root];

    while(queue.length) {
        let len = queue.length;
        let max= -Infinity;

        for (let i = 0; i < len; i++) {
            let top = queue.shift();
            if (max < top.val) {
                max = top.val;
            }

            if (top.left) queue.push(top.left);
            if (top.right) queue.push(top.right);
        }

        res.push(max);
    }

    return res;
};

116. 填充每个节点的下一个右侧节点指针

/**
 * // Definition for a Node.
 * function Node(val, left, right, next) {
 *    this.val = val === undefined ? null : val;
 *    this.left = left === undefined ? null : left;
 *    this.right = right === undefined ? null : right;
 *    this.next = next === undefined ? null : next;
 * };
 */

/**
 * @param {Node} root
 * @return {Node}
 */
var connect = function(root) {
    if (!root) return root;

    let queue = [root];
    while(queue.length) {
        let len = queue.length;

        let first = null;

        for (let i = 0; i < len; i++) {
            let top = queue.shift();

            if (i === 0) {
                first = top;
            } else {
                first.next = top;
                first = top;
            }

            if (top.left) queue.push(top.left);
            if (top.right) queue.push(top.right);
        }
    }

    return root;
};

117. 填充每个节点的下一个右侧节点指针 II

/**
 * // Definition for a Node.
 * function Node(val, left, right, next) {
 *    this.val = val === undefined ? null : val;
 *    this.left = left === undefined ? null : left;
 *    this.right = right === undefined ? null : right;
 *    this.next = next === undefined ? null : next;
 * };
 */

/**
 * @param {Node} root
 * @return {Node}
 */
var connect = function(root) {
    let queue = [root];

    if (!root) return root;

    while(queue.length) {
        let len = queue.length;
        let first = null;
        for (let i = 0; i < len; i++) {
            let top = queue.shift();

            if (first) {
                first.next = top;
            }
            
            first = top;

            if (top.left) queue.push(top.left);
            if (top.right) queue.push(top.right);
        }
    }

    return root;
};

104. 二叉树的最大深度

/**
 * 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 {number}
 */
var maxDepth = function(root) {
    let res = 0;
    if (!root) return res;
    let queue = [root];

    while(queue.length) {
        let len = queue.length;
        for (let i = 0; i < len; i++) {
            let top = queue.shift();
            if (top.left) queue.push(top.left);
            if (top.right) queue.push(top.right);
        }

        res++;
    }
    return res;
};

111. 二叉树的最小深度

/**
 * 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 {number}
 */
var minDepth = function(root) {
    let res = 0;
    if (!root) return res;

    let queue = [root];
    while(queue.length) {
        let len = queue.length;
        res++;
        for (let i = 0; i < len; i++) {
            let top = queue.shift();
            if (top.left) queue.push(top.left);
            if (top.right) queue.push(top.right);
            if (!top.left && !top.right) return res;
        }
    }

    return res;
};

226. 翻转二叉树

递归:

/**
 * 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 {TreeNode}
 */
var invertTree = function(root) {
    if (!root) return root;
    let tmp = root.left;
    root.left = root.right;
    root.right = tmp;
    invertTree(root.left);
    invertTree(root.right);
    return root;
};

迭代:

/**
 * 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 {TreeNode}
 */
var invertTree = function(root) {
    if (!root) return root;
    let stack = [];
    stack.push(root);

    while(stack.length) {
        let top = stack.pop();
        let tmp = top.left;
        top.left = top.right;
        top.right = tmp;
        if (top.right) stack.push(top.right);
        if (top.left) stack.push(top.left);
    }

    return root;
};

101. 对称二叉树

/**
 * 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) {
    function compare(left, right) {
        if (!left && right) {
            return false;
        } else if (left && !right) {
            return false;
        } else if (!left && !right) {
            return true;
        } else if (left.val !== right.val) {
            return false;
        }

        let leftCmp = compare(left.left, right.right);
        let rightCmp = compare(left.right, right.left);
        return leftCmp && rightCmp;
    }

    if (!root) return true;

    return compare(root.left, root.right);
};