LeetCode 1038&538
2020.8.15
我的通过代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
int ans = 0;
public TreeNode bstToGst(TreeNode root) {
traverse(root);
return root;
}
void traverse(TreeNode root) {
if(root==null) return;
if(root.left==null&&root.right==null) {
ans+=root.val;
root.val = ans;
}else {
traverse(root.right);
ans+=root.val;
root.val = ans;
traverse(root.left);
}
}
}
一开始我想着暴力解决,先中序遍历得到一个有序集合,再从后往前一个个累加,再对着树的节点一个个赋值回去。。。实在是太复杂,可能要有两层循环,时间复杂度肯定巨高,想想还是算了。
既然是二叉搜索树肯定需要利用它本身的性质,左小右大。对于一棵只有三个节点的二叉搜索树,我们先处理最右边的那个,然后是根节点,最后是左边那个。那对于任一棵二叉搜索树,整个遍历的过程变成了镜像版的中序遍历,右->根->左,并且时刻用一个全局变量进行记录和赋值,即可完成此题。