538. Convert BST to Greater Tree
Posted Zzz...y
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了538. Convert BST to Greater Tree相关的知识,希望对你有一定的参考价值。
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.
Example:
Input: The root of a Binary Search Tree like this: 5 / 2 13 Output: The root of a Greater Tree like this: 18 / 20 13
给一棵二叉搜索树,每一个节点等于自身加上与比它大的节点的值的和
解决方案比较容易,因为是二叉搜索树,所以右>根>左。这样右节点的值就等于自身(其实这里有个bug),根节点的需要加上右节点的值,左节点再加上改变后的根的值就行了。
于是第一份代码:
1 class Solution { 2 public: 3 TreeNode* convertBST(TreeNode* root) { 4 if(root){ 5 int vr = 0; 6 if( root->right ){ 7 root->right = convertBST(root->right); 8 vr = root->right->val; 9 } 10 root->val += vr; 11 if( root->left ){ 12 root->left->val += root->val; 13 root->left = convertBST(root->left); 14 } 15 } 16 return root; 17 } 18 };
输出结果是错的,
Input: [2,0,3,-4,1] Output: [5,6,3,2,1] Expected: [5,6,3,2,6]
检查以后发现,这样子写,对于每个由“根、左、右”的局部小树的逻辑是对的。但是对整棵二叉树而言,没有考虑到整体右边部分节点对整体左边部分的右节点的影响(有点绕。。。)。反应在输出结果上就是那个“1”没有加上“2和3”。
修改:需要增加一个变量,记录所有“较大值”。
结果为了怎么记录的问题纠结了半天,不想新写一个函数不断传参。还试了试static……最后忍不住看了看网上答案。直接把变量定义在函数体外就完了。瞬间觉得自己傻了。
正确代码:
1 class Solution { 2 private: 3 int sum = 0; 4 public: 5 TreeNode* convertBST(TreeNode* root) { 6 if(root){ 7 root->right = convertBST(root->right); 8 root->val += sum; 9 sum = root->val; 10 root->left = convertBST(root->left); 11 } 12 return root; 13 } 14 };
以上是关于538. Convert BST to Greater Tree的主要内容,如果未能解决你的问题,请参考以下文章
538. Convert BST to Greater Tree
538. Convert BST to Greater Tree
538. Convert BST to Greater Tree
538. Convert BST to Greater Tree