1、如何判断一个树是否是平衡二叉树
解体思路
自顶向下,先定个函数求当前节点的树高多少,那么平衡因子就是左右子树高度差。本质还是利用的树的递归遍历。
代码实现
function isBalacne(root) {
if (!root) {
return true;
}
// 递归去判断左右子树是否都是平衡树
return Math.abs(getHeight(root.left), getHeight(root.right)) <= 1 && isBalacne(root.left) && isBalacne(root.right);
}
function getHeight(node) {
if (!node) {
return 0;
}
return 1 + Math.max(getHeight(node.left), getHeight(node.right));
}
2、设计一个算法来计算二叉树的最大深度
解体思路
- 找出终止条件:当节点为空时
- 找出返回值:节点为空时说明高度为0,所以返回0;节点不为空时则分别求左右子树的高度的最大值,同时加1表示当前节点的高度,返回该数值
- 某层的执行过程:在返回值部分基本已经描述清楚
- 时间复杂度O(n)
代码实现
function maxDepth(root) {
if (!root) {
return 0;
}
// 递归去计算左子树的深度
const left = maxDepth(root.left);
// 递归去计算右子树的深度
const right = maxDepth(root.right);
// 这里加1是因为要加上当前节点
return Math.max(left, right) + 1;
}
1、设计一个算发返判断两个二叉树是不是相同
解体思路
- 终止条件与返回值:当两棵树的当前节点都为 null 时返回 true 当其中一个为 null 另一个不为 null 时返回 false 当两个都不为空但是值不相等时,返回 false
- 执行过程:当满足终止条件时进行返回,不满足时分别判断左子树和右子树 是否相同,其中要注意代码中的短路效应
- 时间复杂度:O(n)
function isSameTree(tree1, tree2) {
// 两棵树的节点都为空
if (!tree1 && !tree2) {
return true;
}
// 只有一棵树的节点为空
if (!tree1 || !tree2) {
return false;
}
// 两棵树的节点的值不一样
if (tree1.val != tree2.val) {
return false;
}
// 递归判断两棵树的所有节点
return isSameTree(tree1.left, tree2.left) && isSameTree(tree1.right, tree2.right);
}