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.

您在真实的面试中是否遇到过这个题?
Yes
样例

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;
}
}; */
上一篇:Java 基于 mysql-connector-java 编写一个 JDBC 工具类


下一篇:利用excel制作二维码