树538. 把二叉搜索树转换为累加树

Posted ocpc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树538. 把二叉搜索树转换为累加树相关的知识,希望对你有一定的参考价值。

题目:

技术图片

 

 

 

解答:

方法一:回溯

想法:

一个反序中序遍历的方法是通过递归实现。通过调用栈回到之前的节点,我们可以轻松地反序遍历所有节点。

 

算法:

在递归方法中,我们维护一些递归调用过程中可以访问和修改的全局变量。首先我们判断当前访问的节点是否存在,如果存在就递归右子树,递归回来的时候更新总和和当前点的值,然后递归左子树。如果我们分别正确地递归 root.right 和 root.left ,那么我们就能正确地用大于某个节点的值去更新此节点,然后才遍历比它小的值。

时间复杂度:O(N)

空间复杂度:O(N)

 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10 class Solution {
11 public:
12 
13     TreeNode* convertBST(TreeNode *root) 
14     {
15         if (root != NULL) 
16         {
17             convertBST(root->right);
18 
19             sum += root->val;
20             root->val = sum;
21 
22             convertBST(root->left);
23         }
24         return root;
25     }
26 private:
27     int sum = 0;
28 };

 

方法二:使用栈迭代 [Accepted]

想法:

如果我们不想使用递归,我们可以通过迭代和栈来实现函数调用栈的过程。

算法:

一个描述迭代栈的方法就是通过递归的思想。首先我们初始化一个空的栈并把根节点作为当前节点。然后只要在栈中有未遍历节点或者 node 节点不为空,我们就将当前节点到最右边叶子路径上的点全部压入栈中。这与递归过程中我们总是先走右子树的思路是一致的,这个思路确保我们总是降序遍历所有节点的值。接下来,我们访问栈顶节点,并考虑它的左子树,这就像我们递归中先遍历当前节点再遍历它的左子树的思路。最后,我们的栈为空并且 node 指向树中最小节点的左孩子 null ,循环结束。

 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10 class Solution {
11 public:
12     
13     TreeNode* convertBST(TreeNode *root) 
14     {
15         int sum = 0;
16         TreeNode *node = root;
17         stack<TreeNode*> st;
18 
19         while (!st.empty() || node != NULL)
20         {
21             /* push all nodes up to (and including) this subtree‘s maximum on
22              * the stack. */
23             while (node != NULL)
24             {
25                 st.push(node);
26                 node = node->right;
27             }
28 
29             node = st.top();
30             st.pop();
31             sum += node->val;
32             node->val = sum;
33 
34             /* all nodes with values between the current and its parent lie in
35              * the left subtree. */
36             node = node->left;
37         }
38 
39         return root;
40     }
41 };

 

以上是关于树538. 把二叉搜索树转换为累加树的主要内容,如果未能解决你的问题,请参考以下文章

538. 把二叉搜索树转换为累加树

538. 把二叉搜索树转换为累加树

538. 把二叉搜索树转换为累加树

LeetCode 把二叉搜索树转换为累加树(538)

[LeetCode]538. 把二叉搜索树转换为累加树

⭐算法入门⭐《二叉树 - 二叉搜索树》中等04 —— LeetCode 538. 把二叉搜索树转换为累加树