二叉树最大深度

在这里插入图片描述

一、 二叉树结构体


/***
 * 二叉树基本的方法
 */
public class TreeNode {

    private String val;

    private TreeNode left;

    private TreeNode right;

    TreeNode(String x) {
        val = x;
    }

    public String getVal() {
        return val;
    }

    public TreeNode getLeft() {
        return left;
    }

    public TreeNode getRight() {
        return right;
    }

    public TreeNode(String val, TreeNode left, TreeNode right) {
        this.val = val;
        this.left = left;
        this.right = right;
    }


}


1.1 生成一个二叉树

    /***
     * 生成一个二叉树的方法
     * @return
     */
    public static TreeNode oneGetter() {

        TreeNode d = new TreeNode("D", new TreeNode("C", null, null), new TreeNode("E", null, null));
        TreeNode b = new TreeNode("B", new TreeNode("A", null, null), d);
        TreeNode i = new TreeNode("I", new TreeNode("H", null, null), null);
        TreeNode g = new TreeNode("G", null, i);
        TreeNode root = new TreeNode("F", b, g);
        return root;
    }

二、求最大深度

2.1 递归求最大深度

时间复杂度:
我们每个结点只访问一次,因此时间复杂度为 O(N)O(N), 其中 NN 是结点的数量。

空间复杂度:
在最糟糕的情况下,树是完全不平衡的,例如每个结点只剩下左子结点,递归将会被调用 NN 次(树的高度),因此保持调用栈的存储将是 O(N)O(N)。但在最好的情况下(树是完全平衡的),树的高度将是 \log(N)log(N)。因此,在这种情况下的空间复杂度将是 O(\log(N))O(log(N))。

    public static int diGuiMaxDeep(TreeNode root) {
        if (root == null) {
            return 0;
        } else {
            int leftDeep = diGuiMaxDeep(root.getLeft());
            int rightDeep = diGuiMaxDeep(root.getRight());
            return Math.max(leftDeep, rightDeep) + 1;
        }
    }

2.2 之前我们写过层序遍历,多少层就是最大深度,借助linkedList


    /***
     * 借助linkedList实现
     * linkedlist有个特点,先放入add()的先被pop()弹出
     * @param root
     * @return
     */
    public static int cengMaxDeep(TreeNode root) {
        int maxDeep = 0;
        if (root == null) {
            return 0;
        }
        LinkedList<TreeNode> linkedList = new LinkedList<>();
        linkedList.add(root);
        TreeNode one;
        while (linkedList .size()>0) {
            maxDeep++;
            int oneCengLen = linkedList.size();

            while (oneCengLen > 0) {
                 one = linkedList.pop();
               if(one!=null){
                   if(one.getLeft()!=null){
                       linkedList.add(one.getLeft());
                   }
                   if(one.getRight()!=null){
                       linkedList.add(one.getRight());
                   }
               }
                oneCengLen--;
            }

        }
        return maxDeep;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值