1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */ 10 11 static int wing=[]() 12 { 13 std::ios::sync_with_stdio(false); 14 cin.tie(NULL); 15 return 0; 16 }(); 17 18 class Solution 19 { 20 public: 21 int mindiff=INT_MAX; 22 int findSecondMinimumValue(TreeNode* root) 23 { 24 travelfind(root); 25 return (mindiff==INT_MAX? -1:mindiff+root->val); 26 } 27 28 void travelfind(TreeNode* root) 29 { 30 int rnum=root->val; 31 if(root->left!=NULL) 32 { 33 if(rnum==root->left->val) 34 travelfind(root->left); 35 else 36 mindiff=min(mindiff,root->left->val-rnum); 37 if(rnum==root->right->val) 38 travelfind(root->right); 39 else 40 mindiff=min(mindiff,root->right->val-rnum); 41 } 42 else 43 return; 44 } 45 };
递归,不要慌,问题不大。子节点一定比父节点大,那么根节点为最小值,
设置一个全局差值变量
只要子节点值和根节点相等,则继续向下查找,否则计算差值,保留最小差值
这样查找,不用遍历完整棵树,只需要遍历完节点值和根节点值相等的所有节点及其子节点即可
返回值为最小差值和根节点值之和