以下三题都是关于二叉树深度的问题
题目1:输入一棵二叉树,求该树的深度(最大)。
注意:从根结点到叶结点依次经过的结点(含根、叶结点),形成树的一条路径,最长路径的长度为树的深度
解析:
1.递归(左右子树的最大深度+1即为此二叉树的深度)
public int TreeDepth(TreeNode root) {
if (root == null) return 0;
int leftDepth = 0, rightDepth = 0;
//加1是算上根节点
leftDepth = 1+TreeDepth(root.left);//左子树的最大深度
rightDepth = 1+TreeDepth(root.right);//右子树的最大深度
return Math.max(leftDepth, rightDepth);
}
2.非递归
类似于非递归后序遍历中的做法。具体见代码:
public int TreeDepth1(TreeNode root) {
if (root == null) return 0;
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
//countDepth记录迭代过程中树的深度
//maxDepth二叉树的最大深度
int countDepth = 1, maxDepth = 0;
TreeNode node = null;
while (root!=null||!stack.isEmpty()){
while (root!= null){
stack.push(root);
root = root.left;
countDepth++;
}
TreeNode curnode = stack.peek();
//当前结点没有右孩子,或该节点右孩子被访问过,回退一个节点
if (curnode.right==null||curnode.right==node){
stack.pop();
node = curnode;
root = null;
countDepth--;
}else{
root = curnode.right;
}
maxDepth = Math.max(maxDepth, countDepth);
}
return maxDepth;
}
题目2:输入一棵二叉树,求该树的最小深度(最小深度是根节点到叶子结点)
解析:这里有个小坑,就是没有左子树或没有右子树的时候,最小深度为左子树的深度或右子树的深度
①如果根节点没有左子树,则其最小深度为右子树的最小深度;
②如果根节点没有右子树,则其最小深度为左子树的最小深度;
③如果根节点均有左子树和右子树,那么最小深度为左子树和右子树中最小的深度;
public int MinTreeDepth(TreeNode root) {
if (root == null) return 0;
int leftDepth = 0, rightDepth = 0;
if (root.left==null&&root.right!=null){
return 1+MinTreeDepth(root.right);
}else if(root.right==null&&root.left!=null){
return 1+MinTreeDepth(root.left);
}else{
return Math.min(1+MinTreeDepth(root.right), 1+MinTreeDepth(root.left));
}
}
题目3:输入一棵二叉树,判断该二叉树是否是平衡二叉树。
解析:左右子树的高度差的绝对值不超过1 左子树 右子树均是平衡二叉树
①先计算左子树的最大深度(左子树的高度)和右子树的最大深度(右子树的最大深度);
②如果左子树与右子树中深度差大于1,则不为平衡二叉树;
③分别判断左子树和右子树是否满足依然为平衡二叉树,如果满足则整棵二叉树为平衡二叉树,如果不满足则整棵二叉树为非平衡二叉树;
public boolean IsBalanced_Solution(TreeNode root) {
if (root == null) return true;
int leftDepth = DepthTree(root.left);
int rigthDepth = DepthTree(root.right);
if (Math.abs(leftDepth-rigthDepth)>1){
//如果左右子树的高度差不满足条件,则为非平衡二叉树
return false;
}else{
if (IsBalanced_Solution(root.left)&&IsBalanced_Solution(root.left)){
//在满足左右二叉树的高度差绝对值不超过1且左右二叉树均为平衡二叉树的条件下,整个二叉树才是平衡二叉树
return true;
}else{
//如果左右子树其中一个为非平衡二叉树,则整个二叉树为非平衡二叉树
return false;
}
}
}
//求以该节点为根节点的树的最大深度
public int DepthTree(TreeNode node){
if (node==null) return 0;
return Math.max(1+DepthTree(node.left), 1+DepthTree(node.right));
}