这是我参与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;
}
}