翻转二叉树
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…
检查一棵二叉树是否对称,就是检查左子树的值是否等于右子树的值
存在以下几种情况
- 左子树存在,右子树不存在,结果是false
- 左子树不存在,右子树不存在,结果是false
- 左子树存在,右子树存在,但是值不相等,结果是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开始计数)
求高度是从下往上计数,用后序遍历(左右根),可以将叶子节点的高度返回给父节点,在此基础上加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;
}
};