算法小知识----11.19----二叉树的坡度

128 阅读2分钟

这是我参与11月更文挑战的第19天,活动详情查看:2021最后一次更文挑战

二叉树的坡度

该题出自力扣的563题——二叉树的坡度(简单题),题解消化于官方解答

审题

给定一个二叉树,计算 整个树 的坡度 。

一个树的 节点的坡度 定义即为,该节点左子树的节点之和和右子树节点之和的 差的绝对值 。如果没有左子树的话,左子树的节点之和为 0 ;没有右子树的话也是一样。空结点的坡度是 0 。

整个树 的坡度就是其所有节点的坡度之和。

  • 简单概括就是,给一个二叉树,找出坡度之和

    • 坡度 = 左节点之和 - 右节点之和
  • 首先这题的思路就是用dfs——深度遍历

    • 找到最底层的叶子节点,并且叶子结点的坡度必定= 0
    • 既然有dfs那就肯定有递归,需考虑递归是否会导致栈溢出(幸运的是,这题不会)
    • 利用一个成员变量叠加每次的左右节点差值
    • 利用一个方法递归返回每个节点的子树(包括自己)之和
  • 时间复杂度:O(n),其中 n 为二叉树中结点总数。我们需要遍历每一个结点。

  • 空间复杂度:O(n)。在最坏情况下, 当树为线性二叉树(即所有结点都只有左子结点或没有结点)时,树的高度为 n−1,在递归时我们需要存储 n 个结点。

编码

public class TreeNodeDemo {
​
    int result;
​
    private static class TreeNode{
        int val;
        TreeNodeDemo.TreeNode leftChild;
        TreeNodeDemo.TreeNode rightChild;
​
        public TreeNode(int val) {
            this.val = val;
        }
    }
​
​
    /**
     * 给定一个二叉树,计算 整个树 的坡度 。
     *
     * 一个树的 节点的坡度 定义即为,该节点左子树的节点之和和右子树节点之和的 差的绝对值 。
     * 如果没有左子树的话,左子树的节点之和为 0 ;没有右子树的话也是一样。空结点的坡度是 0 。
     *
     * 整个树 的坡度就是其所有节点的坡度之和。
     *
     * @param root
     * @return
     */
    public int findTilt(TreeNode root) {
        if (root == null){
            return 0;
        }
        sum(root);
        return result;
​
    }
​
    public int sum(TreeNode root){
        if (root == null)return 0;
        int left = sum(root.leftChild);
        int rigtht = sum(root.rightChild);
        result += Math.abs(left - rigtht);
        return root.val+left+rigtht;
    }
​
​
}

1637203935(1).jpg