538. 把二叉搜索树转换为累加树
题目描述:
给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和。
例如:
思想:
此题目要求我们在一个二叉搜索树上修改渐进线性数目个节点,所以一个高效的解法应该遍历每个节点一次。解法的关键在于应该按照节点值降序遍历所有节点,同时记录我们已经遍历过的节点值的和,并把这个和加到当前节点的值中。这种遍历树的方法被称作 反序中序遍历 ,它确保我们按我们想要的顺序遍历每一个节点。这个算法的基本思想是遍历一个没有遍历过的节点之前,先将大于点值的点都遍历一遍。这些点都在哪里呢?就在右子树里面。
利用回溯思想,一个反序中序遍历的方法是通过递归实现。通过调用栈回到之前的节点,我们可以轻松地反序遍历所有节点。
在递归方法中,维护一些递归调用过程中可以访问和修改的全局变量(sum)。首先判断当前访问的节点是否存在,如果存在就递归右子树,递归回来的时候更新总和和当前点的值,然后递归左子树。如果我们分别正确地递归 root.right 和 root.left ,那么就能正确地用大于某个节点的值去更新此节点,然后才遍历比它小的值。
代码:
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { private: int sum = 0; // sum的声明要在函数外面 public: TreeNode* convertBST(TreeNode* root) { if(root != NULL){ convertBST(root->right); sum += root->val; root->val = sum; convertBST(root->left); } return root; } };