- 二叉树坡度定义
给定一个二叉树,计算 整个树 的坡度 。
一个树的 节点的坡度 定义即为,该节点左子树的节点之和和右子树节点之和的 差的绝对值 。如果没有左子树的话,左子树的节点之和为 0;没有右子树的话也是一样。空结点的坡度是 0 。 整个树 的坡度就是其所有节点的坡度之和。 来源:力扣(LeetCode) 链接:lecode
- 举例
按照如图分析:
节点 2 的坡度:|0-0| = 0(没有子节点)
节点 5 的坡度:|0-0| = 0(没有子节点)
节点 15 的坡度:|0-0| = 0(没有子节点)
节点 4 的坡度:|2-5| = 3(左子树就是左子节点,所以和是 2 ;右子树就是右子节点,所以和是 5 )
节点 13 的坡度:|0-15| = 15(没有左子树,所以和是 0 ;右子树正好是右子节点,所以和是 15 )
节点 8 的坡度:|(2+5+4)-(13+15)| = |11-28| =17
坡度总和:0 + 0 + 0 + 3 + 15 + 17 = 35
- 源码实现
package org.cloud_common.practice;
import java.util.*;
/**
* @ClassName BaiduTest
* @Description: TODO
* @Author drj
* @Date 2021/3/5
* @Version V1.0
**/
public class BaiduTest {
public static class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val) { this.val = val; }
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
static int count = 0;
public static int findTilt(TreeNode root) {
if(root == null){
return 0;
}
int rightValue = findTilt(root.right);
int leftValue = findTilt(root.left);
int num = Math.abs(leftValue - rightValue);
System.out.println("左子树:" + leftValue + "--" + "右字数:" + rightValue + "节点坡度: " + num);
count += num;
return root.val + rightValue + leftValue;
}
public static void main(String[] args) {
TreeNode node1_l = new TreeNode(2,null,null);
TreeNode node1_r = new TreeNode(5,null,null);
TreeNode node1 = new TreeNode(4,node1_l,node1_r);
TreeNode node2_r = new TreeNode(15,null,null);
TreeNode node2 = new TreeNode(13,null,node2_r);
TreeNode node = new TreeNode(8,node1,node2);
findTilt(node);
System.out.printf("坡度总和: "+ count);
}
}