给定一个二叉树,使用递归的方法来打印该树。 |
---|
假如我们要求是使用先序遍历,根左右。
public void preOrderTraverse(TreeNode node)
{ if (node == null) return;
// 先根节点
System.out.println(node.val);
// 再左孩子
preOrderTraverse(node.left);
// 后右孩子
preOrderTraverse(node.right); }
然后,我们再跟换要求,使用中序遍历或者是后序遍历,这时候我们只需要改变 *System.out.println(node.val);*的顺序就可以完成要求。在递归的过程中对整个二叉树检索了一遍,那么我们可以提出一个新的问题:
求一个二叉树的最大深度 |
---|
求一个二叉树的最大深度,也同样需要检索整个二叉树,判断 左右节点的最大长度。和打印二叉树的流程是一致的的。
*public int maxDepth(TreeNode root)*会返回二叉树的最大深度。
class Solution {
public int maxDepth(TreeNode root) {
if(root==null){
return 0;
}
int left=maxDepth(root.left);
int right=maxDepth(root.right);
return left>right?left+1:right+1;
}
}
得到了二叉树的最大深度,现在我想得到二叉树的最小深度,又该怎么使用递归呢?
求一个二叉树的最小深度 |
---|
class Solution {
public int minDepth(TreeNode root) {
if (root == null) return 0;
else if (root.left == null) return minDepth(root.right) + 1;
else if (root.right == null) return minDepth(root.left) + 1;
return Math.min(minDepth(root.right), minDepth(root.left)) + 1;
}
}
递归是比较抽象的,但是求最小深度你可以这么理解,将整个二叉树从根节点开始划分为俩个子树,左子树和右子树,我们要求的最小深度就是左子树的深度和右子树的深度的最小值再加上根节点的1。
从左(右)子树的根节点开始遍历,如果没有左节点 ,就从右节点开始计算长度,如果没有右节点,就从左节点开始计算长度。
在此基础上,我们可以尝试去求解一个平衡二叉树的问题。如果某二叉树中任意结点的左右子树的深度相差不超过1,那么他就是一棵平衡二叉树。
输入一棵二叉树的根结点,判断该树是不是平衡二叉树 |
---|
public class Solution {
public boolean IsBalanced_Solution(TreeNode root) {
return getDepth(root)!=-1;
}
public int getDepth(TreeNode root){
if(root==null) return 0;
int left=getDepth(root.left);
if(left==-1)return -1;
int right=getDepth(root.right);
if(right==-1) return -1;
return Math.abs(left-right)>1?-1:Math.max(left,right)+1;
}
}
你会发现其实递归的流程依旧没有改变,它在return返回值中做了一个判断,如果左右长度的绝对值大于1,就会返回一个-1 。