平衡二叉树题目如下:
平衡二叉树的定义是左右子树的高度差不能大于1。看到这种类型的题,一般会想到用递归的方法来做,一旦用递归,就需要明确递归的三部曲。(1)递归函数的输入和返回值:输入-当前节点作为根节点,返回值肯定是高度;(2)递归终止条件:对于二叉树来说,一般递归的终止条件都是当前节点为空,返回0;(3)单层递归的逻辑:需要判断左右子树的高度差,如果已经大于1,说明不是平衡二叉树,直接返回-1;这样的话,还需要在得到左右子树的高度时,顺便判断一下之前的左右子树是否已经返回了-1,说明之前的子树已经不是平衡二叉树了,所以也就不需要后续的递归了,可以直接返回-1.代码如下:
class Solution {public boolean isBalanced(TreeNode root) {//使用递归法求根节点的左右子树的高度差//1.确定递归函数的输入和返回值:输入-将当前结点作为根节点,返回高度return getHeight(root) != -1;}public int getHeight(TreeNode root){//2.递归终止条件if(root == null) return 0;int leftHeight = getHeight(root.left);if(leftHeight == -1){return -1;//说明左子树里面早就不是平衡二叉树了}int rightHeight = getHeight(root.right);if(rightHeight == -1){return -1;//说明右子树里面早就不是平衡二叉树了}if(Math.abs(leftHeight-rightHeight)>1){return -1;//说明左右子树高度差大于1,不是平衡二叉树} return Math.max(leftHeight, rightHeight)+1;}
}
二叉树的所有路径题目如下:
思路:这里需要对二叉树进行遍历,前序遍历是最合适的,因为他能指向它的左右孩子。递归与回溯是相伴相生的,递归遍历的过程中,一旦遇到叶子结点,就要回溯,不然无法回到其他路径分叉点。在这里,递归的终止条件就不像之前那样遇到空节点返回0,这里是遇到叶子节点后对其进行处理(收获结果的过程)
class Solution {public List<String> binaryTreePaths(TreeNode root) {//存放最终结果字符串List<String> result = new ArrayList<>();if(root == null) return result;//存放结果中的路径,因为要回溯,所以是Integer类型List<Integer> paths = new ArrayList<>();//遍历树traversal(root, paths, result);return result;}public void traversal(TreeNode root, List<Integer> paths, List<String> result){//首先将根结点/中结点加进路径paths.add(root.val);//递归函数终止条件:当遇到叶子结点if(root.left == null && root.right == null){//定义一个容器进行结果处理StringBuffer sb = new StringBuffer();// StringBuilder用来拼接字符串,速度更快for(int i =0; i < paths.size()-1; i++){sb.append(paths.get(i)).append("->");}//加上叶子节点sb.append(paths.get(paths.size()-1));//将整个路径放入结果集中result.add(sb.toString());//注意要使用toString进行转换return;}//递归+回溯,两者相伴而生//递归和回溯是同时进行,所以要放在同一个花括号里if(root.left != null){traversal(root.left, paths, result);//回溯,返回节点的上一层paths.remove(paths.size()-1);}if(root.right != null){traversal(root.right, paths, result);//回溯,返回节点的上一层paths.remove(paths.size()-1);}}
}