LeetCode基础算法-树

LeetCode基础算法-树

LeetCode 树 基础算法


1. 二叉树的最大深度

给定一个二叉树,找出其最大深度。

二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

解题:

  1. 树相关的问题一般都需要靠递归来实现。
  2. 当前节点的深度= 1+max(左子树深度,右子树深度)。
  3. 如果当前节点左右孩子均为null,则当前点为根的树的深度为1.
    public int maxDepth(TreeNode root) {
        // 总结处递归的基线条件
        if (root == null) return 0;
        if (root.left == null && root.right == null) {
            return 1;
        }
        return 1 + Math.max(maxDepth(root.left), maxDepth(root.right));
    }

2. 验证二叉搜索树

给定一个二叉树,判断其是否是一个有效的二叉搜索树。

假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。

解题思路:

  1. 递归实现来验证。
  2. 主要解决的问题是需要框定节点的大小值范围。
  3. 当前节点的左孩子:小于根节点的值。
  4. 当前节点的右孩子:大于根节点的值。
   public boolean isValidBST(TreeNode root) {
        return validate(root, Integer.MIN_VALUE, Integer.MAX_VALUE);
    }

    private boolean validate(TreeNode root, int min, int max) {
        if (root == null) {
            return true;
        }

        if (root.val <= min || root.val >= max) {
            return false;
        }
        return validate(root.left, min, root.val) && validate(root.right, root.val, max);
    }


3. 对称二叉树

给定一个二叉树,检查它是否是镜像对称的。

例如,二叉树 [1,2,2,3,4,4,3] 是对称的。

    1
   / \
  2   2
 / \ / \
3  4 4  3

解题思路:

  1. 递归实现。
  2. 注意树的对称性即可。
   public boolean isSymmetric(TreeNode root) {
        if (root == null) return true;
        return validSymmetric(root.left, root.right);
    }

    private boolean validSymmetric(TreeNode left, TreeNode right) {
        if (left == null && right == null) {
            return true;
        } else if (left == null && right != null) {
            return false;
        } else if (right == null && left != null) {
            return false;
        } else {
            if (left.val != right.val) {
                return false;
            } else {
                return validSymmetric(left.left, right.right) && validSymmetric(left.right, right.left);
            }
        }

    }

4. 二叉树的层次遍历

给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。

例如:
给定二叉树: [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

返回其层次遍历结果:

[
[3],
[9,20],
[15,7]
]

解题思路:

  1. 树的层次遍历主要c采用队列的概念来实现,但是本题目不能使用队列,因为需要分层。
  2. 采用List来存储遍历数据,只有同一层的节点才会被加入。
  3. 采用递归的概念逐步遍历每一层。
    public List> levelOrder(TreeNode root) {
        List> result = new ArrayList<>();
        // 根节点是第0层。
        levelOrder(root, 0, result);
        return result;
    }

    private void levelOrder(TreeNode root, int level, List> result) {
        if (root == null) {
            return;
        }
        // 添加每一层的数据存储
        if (level == result.size()) {
            result.add(new ArrayList<>());
        }
        // 首先加入根节点
        result.get(level).add(root.val);
        // 先左后右
        levelOrder(root.left, level + 1, result);
        levelOrder(root.right, level + 1, result);
    }


5. 将有序数组转换为二叉搜索树

将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。

本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。

给定有序数组: [-10,-3,0,5,9],

一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树:

      0
     / \
   -3   9
   /   /
 -10  5

解题思路:

  1. 使用二分搜索的概念来建立二叉平衡树

    public TreeNode sortedArrayToBST(int[] nums) {
        if (nums == null || nums.length == 0) {
            return null;
        }

        return getTree(nums, 0, nums.length - 1);
    }

    private TreeNode getTree(int[] nums, int low, int high) {
        if (low <= high) {
            // 找到中点
            int mid = low + (high - low) / 2;
            // 以中点建立根节点
            TreeNode node = new TreeNode(nums[mid]);
            // 建立左子树
            node.left = getTree(nums, low, mid - 1);
            // 建立右子树
            node.right = getTree(nums, mid + 1, high);
            return node;
        } else {
            return null;
        }
    }


你可能感兴趣的:(LeetCode基础算法-树)