博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LeetCode] Convert BST to Greater Tree 将二叉搜索树BST转为较大树
阅读量:6527 次
发布时间:2019-06-24

本文共 1903 字,大约阅读时间需要 6 分钟。

 

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     13Output: The root of a Greater Tree like this:             18            /   \          20     13

 

这道题让我们将二叉搜索树转为较大树,通过题目汇总的例子可以明白,是把每个结点值加上所有比它大的结点值总和当作新的结点值。仔细观察题目中的例子可以发现,2变成了20,而20是所有结点之和,因为2是最小结点值,要加上其他所有结点值,所以肯定就是所有结点值之和。5变成了18,是通过20减去2得来的,而13还是13,是由20减去7得来的,而7是2和5之和。我开始想的方法是先求出所有结点值之和,然后开始中序遍历数组,同时用变量sum来记录累加和,根据上面分析的规律来更新所有的数组。但是通过看论坛,发现还有更巧妙的方法,不用先求出的所有的结点值之和,而是巧妙的将中序遍历左根右的顺序逆过来,变成右根左的顺序,这样就可以反向计算累加和sum,同时更新结点值,叼的不行,参见代码如下:

 

解法一:

class Solution {public:    TreeNode* convertBST(TreeNode* root) {        int sum = 0;        helper(root, sum);        return root;    }    void helper(TreeNode*& node, int& sum) {        if (!node) return;        helper(node->right, sum);        node->val += sum;        sum = node->val;        helper(node->left, sum);    }};

 

下面这种方法写的更加简洁一些,没有写其他递归函数,而是把自身写成了可以递归调用的函数,参见代码如下:

 

解法二:

class Solution {public:    TreeNode* convertBST(TreeNode* root) {        if (!root) return NULL;        convertBST(root->right);        root->val += sum;        sum = root->val;        convertBST(root->left);        return root;    }private:    int sum = 0;};

 

下面这种解法是迭代的写法,因为中序遍历有递归和迭代两种写法,逆中序遍历同样也可以写成迭代的形式,参加代码如下:

 

解法三:

class Solution {public:    TreeNode* convertBST(TreeNode* root) {        if (!root) return NULL;        int sum = 0;        stack
st; TreeNode *p = root; while (p || !st.empty()) { while (p) { st.push(p); p = p->right; } p = st.top(); st.pop(); p->val += sum; sum = p->val; p = p->left; } return root; }};

 

参考资料:

 

转载地址:http://sctbo.baihongyu.com/

你可能感兴趣的文章
Oil Deposits
查看>>
poj3984 迷宫问题(简单搜索+记录路径)
查看>>
Linux 服务器buff/cache清理
查看>>
算法试题 及其他知识点
查看>>
php课程---Json格式规范需要注意的小细节
查看>>
hadoop hdfs notes
查看>>
Java反射机制详解(3) -java的反射和代理实现IOC模式 模拟spring
查看>>
(2编写网络)自己动手,编写神经网络程序,解决Mnist问题,并网络化部署
查看>>
【转】如何使用分区助手完美迁移系统到SSD固态硬盘?
查看>>
NIO框架入门(四):Android与MINA2、Netty4的跨平台UDP双向通信实战
查看>>
ios兼容iphonex刘海屏解决方案
查看>>
就是要你懂TCP -- 握手和挥手
查看>>
Andrew Ng机器学习公开课笔记 -- Regularization and Model Selection
查看>>
《Python游戏编程快速上手》一1.3 如何使用本书
查看>>
《Android游戏开发详解》——第1章,第1.3节声明和初始化变量
查看>>
《Visual Studio程序员箴言》----1.2 滚动与导航
查看>>
Processing编程学习指南2.7 Processing参考文档
查看>>
架构师速成-架构目标之伸缩性\安全性
查看>>
执行可运行jar包时读取jar包中的文件
查看>>
linux下ExtMail邮件使用及管理平台
查看>>