平衡二叉树、二叉树的经典题
1 平衡二叉树
题目
输入一棵二叉树,判断该二叉树是否是平衡二叉树。
平衡二叉树:每个子树的深度之差不超过1
思路
-
后续遍历二叉树,在遍历二叉树每个节点前都会遍历其左右子树
-
比较左右子树的深度,若差值>1则返回一个标记-1表示当前子树不平衡
-
若左右子树存在一个不平衡或左右子树差值大于1,则整棵树不平衡
-
若左右子树平衡,则返回当前树深:左右子树最大深度+1
代码
function IsBalanced_Solution(pRoot) {
return balanced(pRoot) != -1;
}
function balanced(node) {
//空树,平衡,树深0
if (!node) {
return 0;
}
//判断左子树
const left = balanced(node.left);
//判断右子树
const right = balanced(node.right);
//判断是否平衡
if (left === -1 || right === -1 || Math.abs(left - right) > 1) {
return -1;
}
//如果平衡,返回树深
return Math.max(left, right) + 1;
}
2 二叉树中和为某一值的路径
输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
思路
套用回溯算法的思路
设定一个结果数组result来存储所有符合条件的路径
设定一个栈stack来存储当前路径中的节点
设定一个和sum来标识当前路径之和
- 从根结点开始深度优先遍历,每经过一个节点,将节点入栈
- 到达叶子节点,且当前路径之和等于给定目标值,则找到一个可行的解决方案,将其加入结果数组
- 遍历到二叉树的某个节点时有2个可能的选项,选择前往左子树或右子树
- 若存在左子树,继续向左子树递归
- 若存在右子树,继续向右子树递归
- 若上述条件均不满足,或已经遍历过,将当前节点出栈,向上回溯
function FindPath(root, expectNumber) {
//存储路径结果
const result = [];
if (root) {
FindPathCore(root, expectNumber, [], 0, result);
}
return result;
}
function FindPathCore(node, expectNumber, stack, sum