Leetcode538. 采用中序遍历将BST转化为节点值更大的树
来源:互联网 发布:淘宝店提高销量有用吗 编辑:程序博客网 时间:2024/06/11 23:52
Leetcode538. 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
解题分析
题目乍一看,很可能被懵住了,在想怎么遍历才能使得左子树的节点的值能够加上右边节点的和。但我们不妨想一下,是否可以将树转化为一个数组,并将其排序?这样我们就可以对数组进行遍历然后依次转化它们的值,最后只需再按顺序将数组元素的值插入到树中就可以了。
我们知道,二叉搜索树有这样一个性质:某个节点的左子树的所有节点的值都会小于该节点,而右子树的所有节点的值都会大于该节点;而中序遍历刚好就是先遍历左子树,再遍历中间节点,最后再遍历右子树。
想到了这一点,问题就解决一大半了。注意中间有一点,我们知道,vector是没有pop_front()的函数的,所以要想删除第一个元素,就必须用迭代器,这显然有点麻烦了;在这里我们做一个小小的变换,将数组颠倒过来,最后再中序遍历往树中插值的时候就可以取出最后一个值并将其pop_back(),这样就省去了一些不必要的麻烦。
源代码
/** * 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* convertBST(TreeNode* root) { if(root == NULL) { return NULL; } int i, j; vector<int> v; inorder(root, v); for(i = 0, j = v.size() - 1; i < j; j--) { v[i] += v[j]; if(i == j - 1) { i++; j = v.size(); } } reverse(v.begin(), v.end()); convert(root, v); return root; } void inorder(TreeNode* root, vector<int>& v) { if(root == NULL) { return; } inorder(root->left, v); v.push_back(root->val); inorder(root->right, v); } void convert(TreeNode* root, vector<int>& v) { if(root == NULL) { return; } convert(root->left, v); root->val = v.back(); v.pop_back(); convert(root->right, v); }};
这只是我对这道题的一些想法,有问题还请在评论区讨论留言~
- Leetcode538. 采用中序遍历将BST转化为节点值更大的树
- 538. Convert BST to Greater Tree 二叉搜索树转化为更大的树
- 将"先竖后横"的遍历序列转化为"先横后竖"的遍历
- [leetcode 285] Inorder Successor in BST---查找二叉搜索树中某个节点在中序遍历中的后续节点
- leetcode 230. Kth Smallest Element in a BST 二叉搜索树BST的中序遍历
- 实现由双亲节点存储的树转化为二叉树的遍历算法实现
- 【树】判断树是否为BST + 求BST的第k个结点 + 判断一个数组是否为BST的后序遍历
- 【BST】找出有重复值的BST中值为key的第一个节点
- 如何将数据库中一列的值转化为数组
- 将单向有序链表转化为BST
- [人人] 求BST的中序后继节点
- 4.5-求BST的中序后继节点
- # Java中遍历Object的属性和属性值,并以String形式返回||toString()一个对象Object||将一个对象转化为字符串String
- 如何将比Long类型更大数值字符串转化为整数
- BST的后序遍历
- 将整数转化为二进制,采用递归方法
- sdut 2128 树结构练习——排序二叉树(BST)的中序遍历
- BST(或者普通树)的中序遍历非递归版本
- org.hibernate.HibernateException: JDBC Driver class not found: com.mysql.jdb
- 心路里程碑
- 微信小程序UI------实现携程首页顶部的界面(弹性布局)
- Qt之模型/视图
- OkHttp
- Leetcode538. 采用中序遍历将BST转化为节点值更大的树
- css 中的属性
- matlab2c使用c++实现matlab函数系列教程-fft函数
- 使用决策树模型预测泰坦尼克号乘客的生还情况
- 互联网后端开发框架--技术术语
- MTK Charge How-to
- 【UML】设计模式与UML
- 程序员提问的智慧(How-To-Ask-Questions-The-Smart-Way)
- Android:让WebView支持<input type=”file”…>元素