2全局变量的作用
https://leetcode.cn/problems/minimum-absolute-difference-in-bst/
以二叉树最小绝对值差为例:
- 如果将pre=cur;这句话写在所有递归函数之前(一般终止条件为第一行代码)作用不大
1 class Solution { 2 private: 3 int result = INT_MAX; 4 TreeNode* pre = NULL; 5 void traversal(TreeNode* cur) { 6 if (cur == NULL) return; 7 pre = cur; 8 traversal(cur->left); // 左 9 if (pre != NULL){ // 中 10 result = min(result, cur->val - pre->val); 11 } 12 traversal(cur->right); // 右 13 } 14 public: 15 int getMinimumDifference(TreeNode* root) { 16 traversal(root); 17 return result; 18 } 19 };
首先,根据第1节前面所述,在所有递归函数之前的代码一进入该结点的递归函数就运行的程序,也就是说pre记录的是当前结点,没什么用,因为当前层递归的形参就是当前结点,也就是说当前层递归想用当前结点直接使用当前层递归的形参就行了
2.本题答案
如果将pre=cur;这句话写在所有左子树递归函数之后
1 class Solution { 2 private: 3 int result = INT_MAX; 4 TreeNode* pre = NULL; 5 void traversal(TreeNode* cur) { 6 if (cur == NULL) return; 7 traversal(cur-> left); // 左 8 if (pre != NULL){ // 中 9 result = min(result, cur->val - pre->val); 10 } 11 pre = cur; // 记录前一个 12 traversal(cur->right); // 右 13 } 14 public: 15 int getMinimumDifference(TreeNode* root) { 16 traversal(root); 17 return result; 18 } 19 };
首先,根据第1节前面所述,在左子树递归函数之后的代码是该节点这层的递归函数中该节点的左子树的递归函数结束之后运行的代码。它起着两个作用:
- 在该节点这层的递归函数中操作左子节点,值得注意的是对左节点的操作程序应该写在pre=cur;这句话之前,也就是说pre=cur;这句话写在右子结点递归函数traversal(cur->right);的上一行。
- 该结点的右子节点能够在右子节点的递归函数中操作该结点