563. 二叉树的坡度
题意描述:
给定一个二叉树,计算整个树的坡度。
一个树的节点的坡度定义即为,该节点左子树的结点之和和右子树结点之和的差的绝对值。空结点的的坡度是0。
整个树的坡度就是其所有节点的坡度之和。
示例:
注意:
- 任何子树的结点的和不会超过32位整数的范围。
- 坡度的值不会超过32位整数的范围。
题意理解:
利用先序遍历的思想,在遍历过程中为返回值加上每一个节点的坡点,最后返回即可。
不足:
存在多次节点的结点和重复计算,可以用hash表记录已经遍历过的路径,不过在本方法中没有实现,所以开销较大,但好在代码简单,容易理解。
代码:
1 #include <iostream> 2 #include <cmath> 3 using namespace std; 4 5 6 //树的结构 7 struct TreeNode { 8 int val; 9 TreeNode *left; 10 TreeNode *right; 11 TreeNode(int x) : val(x), left(NULL), right(NULL) {} 12 }; 13 14 class Solution { 15 public: 16 int sum; 17 int findTilt(TreeNode* root) { 18 sum = 0; 19 20 if(root) 21 { 22 PreOrder(root); 23 return sum; 24 } 25 26 return sum; 27 } 28 29 //遍历程序 30 void PreOrder(TreeNode* root) 31 { 32 if(root) 33 { 34 sum += getTilt(root); //遍历中将每个结点的坡度加到sum上 35 PreOrder(root->left); 36 PreOrder(root->right); 37 } 38 } 39 40 // 获取一个点的坡度 41 int getTilt(TreeNode* node) 42 { 43 if(node == nullptr) 44 return 0; 45 else 46 { 47 int Left, Right; 48 Left = Right = 0; 49 if(node->left) //左子结点不为空,获取左子结点的数值和 50 Left = getVal(node->left); 51 if(node->right) //右子结点不为空,获取右子结点的数值和 52 Right = getVal(node->right); 53 54 return abs(Left - Right); //根据规则返回左右子节点的数值和差的绝对值 55 } 56 } 57 58 //求一个节点以及所有子节点的数值和 59 int getVal(TreeNode* node) 60 { 61 if(node == nullptr) 62 return 0; 63 else 64 return node->val + getVal(node->left) + getVal(node->right); 65 } 66 67 }; 68 69 int main() 70 { 71 TreeNode *root = new TreeNode(1); 72 TreeNode *leftNode = new TreeNode(2); 73 TreeNode *rightNode = new TreeNode(3); 74 TreeNode *Node = new TreeNode(4); 75 root->left = leftNode; 76 leftNode->left = rightNode; 77 leftNode->right = Node; 78 79 Solution s; 80 cout << s.findTilt(root) << endl; 81 return 0; 82 }