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

Leetcode 538. Convert BST to Greater Tree

[LeetCode] 538. Convert BST to Greater Tree