-
思路一
遍历两次- 第一次遍历求出所有结点值的和sum
- 第二次中序遍历,每次都把sum赋给当前结点的值,同时还要让sum减去对应结点之前的值
class Solution { int sum; public TreeNode convertBST(TreeNode root) { sum = 0; dfsAdd(root); dfsDel(root); return root; } void dfsAdd(TreeNode root){ if(null == root) return; sum += root.val; dfsAdd(root.left); dfsAdd(root.right); } void dfsDel(TreeNode root){ if(null == root) return; dfsDel(root.left); sum -= root.val; root.val += sum; dfsDel(root.right); } }
- 这样的缺陷在于,遍历了两次
-
思路二
- 仔细观察,我们需要把当前结点的值改为所有大于等于当前节点值的和,那么如果我们按照val的大小,倒着遍历,每次遍历时让sum加上当前结点的val,那么现在的sum就是当前节点需要被赋的值
- 所谓的倒着遍历就是在中序遍历的基础上,先右后左~
class Solution { Queue<TreeNode> queue; int sum; public TreeNode convertBST(TreeNode root) { queue = new LinkedList<>(); sum = 0; dfsReverse(root); return root; } void dfsReverse(TreeNode root){ if(null == root) return ; dfsReverse(root.right); sum += root.val; root.val = sum; dfsReverse(root.left); } }
剑指offer 专项突破版 54、所有大于等于节点的值之和
最新推荐文章于 2023-06-15 16:47:04 发布