给出二叉搜索树的根节点,该二叉树的节点值各不相同,修改二叉树,使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。
提醒一下,二叉搜索树满足下列约束条件:
节点的左子树仅包含键小于节点键的节点。
节点的右子树仅包含键大于节点键的节点。
左右子树也必须是二叉搜索树。
输入:[4,1,6,0,2,5,7,null,null,null,3,null,null,null,8]
输出:[30,36,21,36,35,26,15,null,null,null,33,null,null,null,8]
1.树中的节点数介于 1 和 100 之间。
2.每个节点的值介于 0 和 100 之间。
3.给定的树为二叉搜索树。
/**
* 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 {
public:
TreeNode* bstToGst(TreeNode* root) {
stack<TreeNode*> s;
int newvalue = 0;
Inordertraverse(root,s,newvalue);
while(!s.empty())
{
TreeNode* tmp = s.top();
int temp = tmp->val;
tmp->val = newvalue;
newvalue -= temp;
s.pop();
}
return root;
}
void Inordertraverse(TreeNode* node, stack<TreeNode*>& s, int& newvalue)
{
if(node == NULL)
return;
Inordertraverse(node->right, s, newvalue);
s.push(node);
newvalue += node->val;
Inordertraverse(node->left, s, newvalue);
}
};
成功
显示详情
执行用时 : 4 ms, 在Binary Search Tree to Greater Sum Tree的C++提交中击败了97.67% 的用户
内存消耗 : 9.4 MB, 在Binary Search Tree to Greater Sum Tree的C++提交中击败了100.00% 的用户
/**
* 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 {
public:
TreeNode* bstToGst(TreeNode* root) {
if(root == NULL)
{
return NULL;
}
int sum = 0;
sumOfTree(root,sum);
TreeNode* p = root;
stack<TreeNode*> s;
while(p || !s.empty())
{
if(p)
{
s.push(p);
p = p->left;
}
else
{
TreeNode* tmp = s.top();
int temp = tmp->val;
tmp->val = sum;
sum -= temp;
s.pop();
p = tmp->right;
}
}
return root;
}
void sumOfTree(TreeNode* root, int& sum)
{
if(root == NULL)
{
return;
}
sum += root->val;
sumOfTree(root->left, sum);
sumOfTree(root->right, sum);
}
};```