LIntcode---将二叉搜索树转成较大的树
Given a Binary Search Tree (BST), convert it to a Greater Tree such that every key of the original BST is changed to the original key plus sum of all keys greater than the original key in BST.
样例
Given a binary search Tree `{5,2,3}`:
5
/ \
2 13
Return the root of new tree
18 / \ 20 13
思路:
看清楚题目,题目给的条件是一颗二叉搜索树!!!
这道题让我们将二叉搜索树转为较大树,通过题目汇总的例子可以明白,是把每个结点值加上所有比它大的结点值总和
当作新的结点值。
仔细观察题目中的例子可以发现,2变成了20,而20是所有结点之和,因为2是最小结点值,要加上其他
所有结点值,所以肯定就是所有结点值之和。5变成了18,是通过20减去2得来的,而13还是13,是由20
减去7得来的,而7是2和5之和。我开始想的方法是先求出所有结点值之和,然后开始中序遍历数组,同
时用变量sum来记录累加和,根据上面分析的规律来更新所有的数组。
但是通过看论坛,发现还有更巧妙的方法,不用先求出的所有的结点值之和,而是巧妙的将中序遍历左根右的顺序逆过来,
变成右根左的顺序,这样就可以反向计算累加和sum,同时更新结点值,参见代码如下:
class Solution { public: /** * @param root the root of binary tree * @return the new root */ TreeNode* convertBST(TreeNode* root) { // Write your code here int sum = 0; help(root, sum); return root; } void help(TreeNode*& node, int& sum) { if (node==NULL){ return; } help(node->right, sum); node->val += sum; sum = node->val; help(node->left, sum); } };
另一种迭代方法:
/* class Solution { public: TreeNode* convertBST(TreeNode* root) { if (!root) return NULL; int sum = 0; stack<TreeNode*> st; TreeNode *p = root; while (p || !st.empty()) { while (p) { st.push(p); p = p->right; } p = st.top(); st.pop(); p->val += sum; sum = p->val; p = p->left; } return root; } }; */