面试题55:二叉树的深度 平衡二叉树

1.面试题55:求二叉树的深度

二叉树的深度、高度、层数,指的是一个意思。

测试用例情况:(1)根结点为空 (2)只有左子树 (3)只有右子树 (4)左右子树都有 (5)只有1个结点

这个测试用例是对于大多数的二叉树的题目都需要考虑的。

这里先给出结点成员内部类的定义:

public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;
    public TreeNode(int val) {
        this.val = val;
    }

    }

      下面是正式的方法代码:(18ms 8300k:剑指Offer教材上的,这个最好)

public int getTreeDepth(TreeNode root) {


if(root==null) return 0;//必须要有,这是因为包含空结点的测试用例

int leftDepth=getTreeDepth(root.left);

int rightDepth=getTreeDepth(root.right);

return (leftDepth>rightDepth)?leftDepth +1:rightDepth+1;

}

2.求二叉树的结点总数

测试用例情况:(1)根结点为空 (2)只有左子树 (3)只有右子树 (4)左右子树都有 (5)只有1个结点

public int getNum(TreeNode root) {


if(root==null) {
return 0;

}else {

int leftNum=getNum(root.left);

int rightNum=getNum(root.right);

return leftNum+rightNum+1;

}

}

3.求二叉树的叶子结点总数

测试用例情况:(1)根结点为空 (2)只有左子树 (3)只有右子树 (4)左右子树都有 (5)只有1个结点

public int getLeafNum(TreeNode root) {
if(root==null) {
return 0;
}else if(root.left==null && root.right==null) {
return 1;

}else {
int leftLeafNum=getLeafNum(root.left);
int rightLeafNum=getLeafNum(root.right);
return leftLeafNum+rightLeafNum;
}

}

4.判断一棵二叉树是否为平衡二叉树

平衡二叉树的特点:

(1)若二叉树为空,则是平衡二叉树;若二叉树只有一个根结点,那么也是平衡二叉树

(2)若不空,就需要二叉树中每一个结点的左右子树深度差不超过1。

(3)普通解法:每个节点会重复访问,基于前序遍历的思路,先判断根结点是不是满足条件,再判断其左右子树是不是满足条件。

// 19ms 8552k

public boolean isBalancedTree(TreeNode root) {

if(root==null) {
return true;//(1)若二叉树为空,则是平衡二叉树
}else {
int leftDepth=getTreeDepth(root.left);
int rightDepth=getTreeDepth(root.right);
if(Math.abs(leftDepth-rightDepth)>1) {
return false;
}else {
return isBalancedTree(root.left) && isBalancedTree(root.right);//(2)若不空,就需要二叉树中每一个结点的左右子树深度差不超过1
}
}

}

(4)好的解法:每个节点只会访问一次:从下往上遍历,后序遍历的思路,在判断一个结点之前,先判断它的左右子树是不是满足平衡二叉树的条件

public class Solution {
    boolean result=true;
    public boolean IsBalanced_Solution(TreeNode root) {
        getTreeDepth(root);
        return result;
    }
    public int getTreeDepth(TreeNode root){
        if(root==null){
            return 0;
        }else{
            int m=getTreeDepth(root.left);
            int n=getTreeDepth(root.right);
            int diff=m-n;
            if(diff>1 || diff<-1){
                result=false;
            }
            return (m>n)?m+1:n+1;
        }
    }
}

    原文作者:平衡二叉树
    原文地址: https://blog.csdn.net/qq_21428081/article/details/79435596
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞