102. 二叉树的层序遍历
/**
* 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) {
const queue = [];
if (root !== null) queue.push(root);
const res = [];
while (queue.length) {
const row = [];
let size = queue.length;
while (size) {
// 队列是从头出去
const node = queue.shift();
row.push(node.val);
if (node.left) queue.push(node.left);
if (node.right) queue.push(node.right);
size--;
}
res.push(row);
}
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) {
const queue = [];
const res = [];
if (root !== null) queue.push(root);
while (queue.length) {
const row = [];
let size = queue.length;
while (size) {
const node = queue.shift();
row.push(node.val);
node.left && queue.push(node.left);
node.right && queue.push(node.right);
size--;
}
res.unshift(row);
}
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) {
const queue = [], res = [];
if (root !== null) queue.push(root);
while (queue.length) {
let size = queue.length;
while (size) {
const node = queue.shift();
// 每一层的最后一个元素
if (size === 1) res.push(node.val);
node.left && queue.push(node.left);
node.right && queue.push(node.right);
size--;
}
}
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) {
const queue = [], res = [];
if (root !== null) queue.push(root);
while (queue.length) {
let size = queue.length;
// 处理每一层的每个元素
let sum = 0;
// 需要得到每一层的length,所以需要用for而非while
for (let i = 0; i < size; i++) {
const node = queue.shift();
sum += node.val;
node.left && queue.push(node.left);
node.right && queue.push(node.right);
}
res.push(sum / size);
}
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) {
const queue = [], res = [];
if (root !== null) queue.push(root);
while (queue.length) {
const row = [];
let size = queue.length;
while (size) {
const node = queue.shift();
row.push(node.val);
// node.children
for (let child of node.children) {
child && queue.push(child);
}
size--;
}
res.push(row);
}
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) {
const queue = [], res = [];
if (root !== null) queue.push(root);
while (queue.length) {
let size = queue.length;
let max = queue[0].val;
while (size) {
const node = queue.shift();
max = Math.max(max, node.val);
node.left && queue.push(node.left);
node.right && queue.push(node.right);
size--;
}
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) {
const queue = [];
if (root !== null) queue.push(root);
while (queue.length) {
let size = queue.length;
for (let i = 0; i < size; i++) {
const node = queue.shift();
// 【关键代码】每一层除了最后一个
if (i < size - 1) node. next = queue[0];
node.left && queue.push(node.left);
node.right && queue.push(node.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) {
const queue = [];
if (root !== null) queue.push(root);
while (queue.length) {
let size = queue.length;
for (let i = 0; i < size; i++) {
const node = queue.shift();
if (i < size - 1) node.next = queue[0];
node.left && queue.push(node.left);
node.right && queue.push(node.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) {
const queue = [];
let height = 0;
if (root !== null) queue.push(root);
while (queue.length) {
let size = queue.length;
while (size) {
const node = queue.shift();
node.left && queue.push(node.left);
node.right && queue.push(node.right);
size--;
}
height++;
}
return height;
};
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) {
// 只有当左右孩子都为空时,才停止遍历,返回 height
const queue = [];
let height = 0;
if (root !== null) queue.push(root);
while (queue.length) {
let size = queue.length;
// 记录最小深度
height++;
while (size) {
const node = queue.shift();
node.left && queue.push(node.left);
node.right && queue.push(node.right);
if (!node.left && !node.right) return height;
size--;
}
}
return height;
};
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 === null) return root;
const temp = root.left;
root.left = root.right;
root.right = temp;
invertTree(root.left);
invertTree(root.right);
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) {
// 比较函数
// 左右共5种情况
const compare = function(left, right) {
if (left !== null && right === null) return false;
else if (left === null && right !== null) return false;
else if (left === null && right === null) return true;
else if (left.val !== right.val) return false;
let outside = compare(left.left, right.right);
let inside = compare(left.right, right.left);
return outside && inside;
}
if (root === null) return true;
return compare(root.left, root.right);
};