面试题55:二叉树的深度

题目:

二叉树的深度

输入一棵二叉树的根节点,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。

分析:

如果一棵树只有一个结点,那么它的深度是1。树的深度是max(根节点左孩子深度,根节点右孩子深度)+1。

解法:

package com.wsy;

class Tree {
    private int value;
    private Tree left;
    private Tree right;

    public Tree() {
    }

    public Tree(int value) {
        this.value = value;
        this.left = this.right = null;
    }

    public Tree(int value, Tree left, Tree right) {
        this.value = value;
        this.left = left;
        this.right = right;
    }

    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        this.value = value;
    }

    public Tree getLeft() {
        return left;
    }

    public void setLeft(Tree left) {
        this.left = left;
    }

    public Tree getRight() {
        return right;
    }

    public void setRight(Tree right) {
        this.right = right;
    }
}

public class Main {
    public static int count;

    public static void main(String[] args) {
        Tree tree = init();
        int depth = getDepth(tree);
        System.out.println("树的深度是:" + depth);
    }

    public static Tree init() {
        Tree tree7 = new Tree(7);
        Tree tree6 = new Tree(6);
        Tree tree5 = new Tree(5, tree7, null);
        Tree tree4 = new Tree(4);
        Tree tree3 = new Tree(3, null, tree6);
        Tree tree2 = new Tree(2, tree4, tree5);
        Tree tree1 = new Tree(1, tree2, tree3);
        return tree1;
    }

    public static int getDepth(Tree tree) {
        if (tree == null) {
            return 0;
        }
        return Math.max(getDepth(tree.getLeft()), getDepth(tree.getRight())) + 1;
    }
}

题目:

平衡二叉树

输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某棵二叉树中任意结点的左、右子树的深度相差不超过1,那么它就是一棵平衡二叉树。

分析:

需要重复遍历结点多次的解法,简单但不足以打动面试官

借助求二叉树深度的方法,可以得到每个结点的左右子树深度,判断每个结点左右子树深度相差不超过1,那么就是一棵平衡二叉树。

每个结点只遍历一次的解法,正是面试官喜欢的

如果我们采用后序遍历的方式遍历二叉树的每个结点,在遍历到一个结点时,它的左右子树已经判断过了,只需要查看结果即可。如果有子树不满足平衡了,直接返回,后面的结点也不需要验证了。

解法:

需要重复遍历结点多次的解法,简单但不足以打动面试官

package com.wsy;

class Tree {
    private int value;
    private Tree left;
    private Tree right;

    public Tree() {
    }

    public Tree(int value) {
        this.value = value;
        this.left = this.right = null;
    }

    public Tree(int value, Tree left, Tree right) {
        this.value = value;
        this.left = left;
        this.right = right;
    }

    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        this.value = value;
    }

    public Tree getLeft() {
        return left;
    }

    public void setLeft(Tree left) {
        this.left = left;
    }

    public Tree getRight() {
        return right;
    }

    public void setRight(Tree right) {
        this.right = right;
    }
}

public class Main {
    public static void main(String[] args) {
        Tree tree = init();
        boolean balance = checkBalance(tree);
        System.out.println(balance ? "是平衡二叉树" : "不是平衡二叉树");
    }

    public static Tree init() {
        Tree tree7 = new Tree(7);
        Tree tree6 = new Tree(6);
        Tree tree5 = new Tree(5, tree7, null);
        Tree tree4 = new Tree(4);
        Tree tree3 = new Tree(3, null, tree6);
        Tree tree2 = new Tree(2, tree4, tree5);
        Tree tree1 = new Tree(1, tree2, tree3);
        return tree1;
    }

    public static int getDepth(Tree tree) {
        if (tree == null) {
            return 0;
        }
        return Math.max(getDepth(tree.getLeft()), getDepth(tree.getRight())) + 1;
    }

    public static boolean checkBalance(Tree tree) {
        if (tree == null) {
            return true;
        }
        int left = getDepth(tree.getLeft());
        int right = getDepth(tree.getRight());
        int difference = Math.abs(left - right);
        if (difference > 1) {
            return false;
        }
        return checkBalance(tree.getLeft()) && checkBalance(tree.getRight());
    }
}

每个结点只遍历一次的解法,正是面试官喜欢的

package com.wsy;

class Tree {
    private int value;
    private Tree left;
    private Tree right;

    public Tree() {
    }

    public Tree(int value) {
        this.value = value;
        this.left = this.right = null;
    }

    public Tree(int value, Tree left, Tree right) {
        this.value = value;
        this.left = left;
        this.right = right;
    }

    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        this.value = value;
    }

    public Tree getLeft() {
        return left;
    }

    public void setLeft(Tree left) {
        this.left = left;
    }

    public Tree getRight() {
        return right;
    }

    public void setRight(Tree right) {
        this.right = right;
    }
}

public class Main {
    public static void main(String[] args) {
        Tree tree = init();
        boolean balance = checkBalance(tree) != -1;
        System.out.println(balance ? "是平衡二叉树" : "不是平衡二叉树");
    }

    public static Tree init() {
        Tree tree7 = new Tree(7);
        Tree tree6 = new Tree(6);
        Tree tree5 = new Tree(5, tree7, null);
        Tree tree4 = new Tree(4);
        Tree tree3 = new Tree(3, null, tree6);
        Tree tree2 = new Tree(2, tree4, tree5);
        Tree tree1 = new Tree(1, tree2, tree3);
        return tree1;
    }

    public static int checkBalance(Tree tree) {
        if (tree == null) {
            return 0;
        }
        int left = checkBalance(tree.getLeft());
        if (left == -1) {
            return -1;
        }
        int right = checkBalance(tree.getRight());
        if (right == -1) {
            return -1;
        }
        int difference = Math.abs(left - right);
        if (difference > 1) {
            return -1;
        } else {
            return 1 + Math.max(left, right);
        }
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值