563. 二叉树的坡度

题意描述:

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

一个树的节点的坡度定义即为,该节点左子树的结点之和和右子树结点之和的差的绝对值。空结点的的坡度是0。

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

示例:

注意:

  1. 任何子树的结点的和不会超过32位整数的范围。
  2. 坡度的值不会超过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 }

 

posted @ 2019-01-05 17:15  小王点点  阅读(365)  评论(0编辑  收藏  举报