题目
给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。
示例:
思路
- 判断一棵树是否未平衡二叉树
- 首先:明白平衡二叉树的概念!!!
-
一个二叉树左右两个子树的高度差不超过1 也就是小于等于1
-
把两个子树的树高求出来之后进行比较,超过1的则返回-1,其他的正常返回树高
-
递归三部曲:
-
入参,出参: 树节点,返回数高,子树高度差大于1的返回-1
-
最小问题:拿到两个子树的树高
-
边界值:node == null, return 0;
-
代码实现
public boolean isBalanced(TreeNode root) {
return getHeight(root) != -1;
}
private int getHeight(TreeNode node) {
if(node == null) return 0;
int leftHeight = getHeight(node.left);
if(leftHeight == -1) return -1;
int rightHeight = getHeight(node.right);
if(rightHeight == -1) return -1;
if(Math.abs(leftHeight - rightHeight) > 1) return -1;
return Math.max(leftHeight, rightHeight) + 1;
}
题目
给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。
叶子节点 是指没有子节点的节点。
示例
思路:
-
二叉树所有的路径,想象一下,给你一颗最小的二叉树,你怎么求路径
-
1->2 , 1->3 这是想要的结果
- 1、根节点在前,所以根节点必须先加入path,于是决定了遍历顺序位前序遍历 中左右
- 2、然后通过回溯的方式,将最后加入的节点删除,为了给后续路径腾出空间
- 3、只要是递归一定伴随这回溯
- 上面例子其实就是 1加入,2不为空加入,再回溯,3加入,在回溯
- 然后加上逻辑处理的细节
代码实现
public List<String> binaryTreePaths(TreeNode root) {
List<String> result = new ArrayList<>();
if(root==null){
return result;
}
List<Integer> paths = new ArrayList<>();
traversal(root,paths,result);
return result;
}
/**
* 递归
* @param node
* @param paths
* @param result
*/
private void traversal(TreeNode node,
List<Integer> paths,
List<String> result) {
//先加入根节点 ,中
paths.add(node.value);
//终止条件
if(node.left==null&&node.right==null){
//到达叶子节点
StringBuilder builder = new StringBuilder();
for (int i = 0; i < paths.size()-1; i++) {
builder.append(paths.get(i)).append("->");
}
builder.append(paths.get(paths.size()-1));
result.add(builder.toString());
return;
}
//左
if(node.left!=null){
traversal(node.left,paths,result);
//回溯,删除最后一个
paths.remove(paths.size()-1);
}
//右
if(node.right!=null){
traversal(node.right,paths,result);
paths.remove(paths.size()-1);
}
}