543. 二叉树的直径
给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。
它题目所说的直径其实是这样:
4-2-1-3
5-2-1-3
相当于左子树的深度 和右子树的深度 都取最大 然后相加 (需要加上根节点)
/**
* @param {TreeNode} root
* @return {number}
*/
var diameterOfBinaryTree = function(root) {
let max = 1;
function dfs(root) {
if(!root) return 0;
let L = dfs(root.left) // 递归遍历左子树
let R = dfs(root.right); // 递归遍历左子树
max = Math.max(max,R + L + 1);
return Math.max(R,L) + 1
}
dfs(root)
return max - 1 // 前面取左右子树最大都+1 所以这边要-1 除去一个
};
下面这里两道道就当复习一下二叉树的层序遍历
103. 二叉树的锯齿形层序遍历
给定一个二叉树,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
/**
* @param {TreeNode} root
* @return {number[][]}
*/
var zigzagLevelOrder = function(root) {
if (!root) return [];
let res = [];
let q = [root];
let flag = true;
while (q.length) {
let arr = []
let len = q.length;
for (let i = 0;i < len;i++) {
let node = q.shift();
if(flag) {
arr.push(node.val);
} else {
arr.unshift(node.val);
}
if (node.left) q.push(node.left);
if (node.right) q.push(node.right);
}
res.push(arr);
flag = !flag
}
return res
};
199. 二叉树的右视图
给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
/**
* @param {TreeNode} root
* @return {number[]}
*/
var rightSideView = function(root) {
if (!root) return [];
let res = [];
let q = [root];
while (q.length) {
let arr = []
let len = q.length;
for (let i = 0;i < len;i++) {
let node = q.shift();
arr.unshift(node.val);
if (node.left) q.push(node.left);
if (node.right) q.push(node.right);
}
res.push(arr[0]);
}
return res
};