编程导航算法村第八关 | 树的深度优先遍历(二)

编程导航算法村第八关 | 树的深度优先遍历(二)

最大深度问题

首先看一下104题最大深度:给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。

  • 思路:
    • 采用深度优先遍历,分别遍历左右子树,比较左右子树的深度,返回最大值
public int maxDepth(TreeNode root) {
        if (root == null) {
            return 0;
        }
        int result = dfs(root, 0);
        return result;
    }

    int dfs(TreeNode root, int deep) {
        if (root == null) {
            return deep;
        }
        int left = dfs(root.left, deep + 1);
        int right = dfs(root.right, deep + 1);

        return left >= right ? left : right;
    }

判断平衡树

LeetCode110 判断平衡二叉树:给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。

  • 思路:每个节点都进行判断,获取待判断元素的左子树的深度,获取带判断元素右子树的深度,判断差值是否小于1;接着判断左节点是否是高度平衡的二叉树,再判断右子树是不是高度平衡的二叉树
 public boolean isBalanced(TreeNode root) {
        if (root == null) {
            return true;
        }
        int left = dfs(root.left, 0);
        int right = dfs(root.right, 0);
        if (Math.abs(left - right) > 1) {
            return false;
        }

        Boolean lb = isBalanced(root.left);
        Boolean rb = isBalanced(root.right);

        return lb && rb;

//        final int dfs = dfs(root, 0);
//        if (dfs <= 1) {
//            return true;
//        } else {
//            return false;
//        }
    }

    int dfs(TreeNode root, int deep) {
        if (root == null) {
            return deep;
        }
//        得到左右字数的深度
        int left = dfs(root.left, deep + 1);
        int right = dfs(root.right, deep + 1);
//      左右字数的差值

        return left >= right ? left : right;
    }

最小深度

既然有最大深度,那是否有最小深度呢?LeetCode111就是:给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量

  • 思路:
    • 使用深度优先遍历,得到左右子树的高度
    • 有三种情况:根节点两端都有子树
      • 返回高度的中的最小值
    • 没有左子树
      • 返回右子树的高度
    • 没有右子树
      • 返回左子树的高度
 public int minDepth(TreeNode root) {
        if (root == null) {
            return 0;
        }
//        if (root.left == null || root.right == null) {
//            return 1;
//        }
        final int dfs = dfs(root, 0);
        return dfs;
    }

    int dfs(TreeNode root, int deep) {
        if (root == null) {
            return deep;
        }
        int left = dfs(root.left, deep + 1);

        int right = dfs(root.right, deep + 1);

        if (root.left == null && root.right != null) {
            return right;
        }
        if (root.left != null && root.right == null) {
            return left;
        }
        return left <= right ? left : right;
    }

N叉树的最大深度

如果将二叉树换成N叉树又该怎么做呢?这就是LeetCode559.给定一个 N 叉树,找到其最大深度。最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。N 叉树输入按层序遍历序列化表示,每组子节点由空值分隔

 public int maxDepth(Node root) {
        if (root == null) {
            return 0;
        }

        return dfs(root);

    }

    int dfs(Node root) {
        if (root == null) {
            return 0;
        } else if (root.children.isEmpty()) {
            return 1;
        } else {
            final ArrayList<Integer> integers = new ArrayList<>();
            for (Node node : root.children) {
                int max = dfs(node);
                integers.add(max);
            }
            return Collections.max(integers) +1;
        }

    }
  • 解法二
    • 思路:使用深度优先遍历
    public int maxDepth(Node root) {
        if (root == null) {
            return 0;
        }
        return dfs(root, 0);

    }

    int dfs(Node root, int deep) {
        if (root == null) {
            return deep;
        } else if (root.children.isEmpty()) {
            return deep + 1;
        } else {
             ArrayList<Integer> integers = new ArrayList<>();
            for (Node node : root.children) {
                int max = dfs(node, deep + 1);
                integers.add(max);
            }
            return Collections.max(integers);
        }

    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值