leetcode 538. Convert BST to Greater Tree
一. 这道题我想起了考研时候的二叉排序树的特点~即中序遍历是递增的
但是我又想,只知道中序的话是不能还原出原二叉树的。
然后又去想 递归,具体过程是 计算某个节点的val的时候,必须加他父亲节点还有他的右子树的和,但是当一个节点是他父亲节点的右侧节点时,还得去找父亲的父亲。。所以递归没有想出来。于是求助了答案。
二. 看了一个答案思想之后,顿时觉得自己很2。 我刚开始用中序遍历可以直接把节点放入vector啊。不用把节点的值放入vector。。。 这样用迭代器遍历就好了。还不会改变树的结构。。智障啊。。
然后自己写了一下就AC了。
三.学习到的细节。在迭代器中end.()-1就是减了一个元素的地址,而不是就-1.
还有细节是end.()是指向最后一个元素的下一个位置。。之前一直懵逼。
四.
class Solution {
public:
vector <TreeNode *> treelist;
vector <TreeNode *> ::iterator it;
TreeNode* convertBST(TreeNode* root)
{
if(root){ //这个if是为了输入null的时候用的
gothrough(root);
for(it=treelist.end()-2;it!=treelist.begin()-1;it--)
(*it)->val += (*(it+1))->val;
}
return root;
}
void gothrough(TreeNode *root) //这步操作把所有树节点中序遍历的顺序加入到treelist里
{
if(!root)
return ;
gothrough(root->left);
treelist.push_back(root);
gothrough(root->right);
}
};