一、题目简介
给定一颗二叉搜索树(Binary Search Tree,BST),将其转化为一颗更大的树使得原始二叉树的节点值改变为树中所有比其节点值大的节点元素之和。
例如:
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
二、编程思路
二叉搜索树基本性质及概念:
- 对于任意节点,如果其左子树不为空,则左子树上所有节点值均小于该节点值;
- 对于任意节点,如果其右子树不为空,则右子树上所有节点值均大于该节点值;
- 任意节点的左右子树均为二叉搜索树;
- 没有值相同的节点。
根据以上性质可以看出,对一颗二叉搜索树进行先搜索右子树的中序遍历,其结果就是树中所有节点值的从大到小排序。对于本题,举简单的例子寻找其规律。
例如给定下面的树,解题思路如下:
5
/ \
2 13
/ \ / \
1 3 7 15
三、代码实现
3.1 递归实现
class Solution {
public:
int sum=0;
void DFS(TreeNode* cur){
//遍历右子树
if(cur->right!=NULL){
DFS(cur->right);
}
sum+=cur->val;
cur->val=sum;
//遍历左子树
if(cur->left!=NULL){
DFS(cur->left);
}
}
TreeNode* convertBST(TreeNode* root) {
if(root){
DFS(root);
}
return root;
}
};
3.2 非递归实现
//二叉树的中序遍历
class Solution {
public:
int sum=0;
TreeNode* convertBST(TreeNode* root) {
if(root==NULL) return root;
stack<TreeNode*> s;
TreeNode* cur=root;
while(cur!=NULL || !s.empty()){
//将当前节点入栈
while(cur!=NULL){
s.push(cur);
cur = cur->right;//先遍历右子树
}
if(!s.empty()){
cur=s.top();
s.pop();
sum+=cur->val;
cur->val=sum;
cur = cur->left;
}
}
return root;
}
};