相关文章汇总:
// Definition for a binary tree node.
struct TreeNode
{
int val;
TreeNode *left;
TreeNode *right;
TreeNode() : val(0), left(nullptr), right(nullptr) {
}
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {
}
TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {
}
};
给你一棵二叉搜索树,请你按中序遍历将其重新排列为一棵递增顺序搜索树,使树中最左边的节点成为树的根节点,
并且每个节点没有左子节点,只有一个右子节点。
class Solution {
public:
//将二叉搜索树转换为一个排序好的vector
void orderTree2vector(TreeNode *node, vector<int> &vec)
{
if(node==nullptr) return;
orderTree2vector(node->left, vec);
vec.push_back(node->val);
orderTree2vector(node->right, vec);
}
//将二叉搜索树转换成递增顺序搜索树
TreeNode* increasingBST(TreeNode* root) {
vector <int>vec;
orderTree2vector(root, vec);
//创建一个新的节点
TreeNode *newNode = new TreeNode(-1);
TreeNode *currNode = newNode;
for(int value: vec)
{
currNode->right = new TreeNode(value);
currNode = currNode->right;
}
return newNode->right;
}
};
复杂度分析:
给定二叉搜索树的根结点 root,返回值位于范围 [low, high] 之间的所有结点的值的和。
提示:
树中节点数目在范围 [1, 2 * 104] 内
1 <= Node.val <= 105
1 <= low <= high <= 105
所有 Node.val 互不相同
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/range-sum-of-bst
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
本题可以通过中序遍历将二叉树中的值按顺序存储到一个数组中,然后再计算[low, high]之间的数的和,但是并不推荐这么做。我们可以利用二叉搜索树本身的结构,以及有序性的性质 ,利用更小的复杂度来解决本题。
解法:深度优先搜索
按深度优先搜索的顺序计算范围和。记当前子树根节点为 root,分以下四种情况讨论:
C++实现如下:
class Solution {
public:
int rangeSumBST(TreeNode *root, int low, int high) {
if (root == nullptr) {
return 0;
}
if (root->val > high) {
return rangeSumBST(root->left, low, high);
}
if (root->val < low) {
return rangeSumBST(root->right, low, high);
}
return root->val + rangeSumBST(root->left, low, high) + rangeSumBST(root->right, low, high);
}
};
复杂度分析:
给定一棵二叉搜索树,请找出其中第k大的节点。
限制:
1 ≤ k ≤ 二叉搜索树元素个数
原题:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-di-kda-jie-dian-lcof/
class Solution {
public:
// 倒序遍历二插入,将数字从大到小存入数组vec中
void orderTree2vector(TreeNode* root, vector<int> &vec)
{
if(root==nullptr) return;
orderTree2vector(root->right, vec);
vec.push_back(root->val);
orderTree2vector(root->left, vec);
}
// 取vec的第k大数即可
int kthLargest(TreeNode* root, int k) {
vector<int> vec;
orderTree2vector(root, vec);
return vec[k-1];
}
};