题目描述
注意是二叉搜索树,可以找出顺序 ! 有点类似中序遍历
思路 & 代码
思路:当前结点 root 带着父值一直走到最右边,再一个个累加右值 更新 root.val += rightSum,然后以 root.val 作为左子树的父值,递归这个过程 左子树递归结束,当前 root 的栈帧返回左子树的值(毕竟这边才是最大值嘛) 时间复杂度O(n),相当于遍历每一个结点
class Solution { public TreeNode convertBST ( TreeNode root) { toConvertBST ( root, 0 ) ; return root; } int toConvertBST ( TreeNode root, int paNum) { if ( root == null ) { return paNum; } int rightSum = toConvertBST ( root. right, paNum) ; root. val += rightSum; int leftSum = toConvertBST ( root. left, root. val) ; return leftSum; }
}
更新版
一段时间过去后,写出了更加简单的代码呢! 思路还是:右 - 根 - 左,递归
class Solution { int preNum = 0 ; public TreeNode convertBST ( TreeNode root) { if ( root != null ) { convertBST ( root. right) ; root. val += preNum; preNum = root. val; convertBST ( root. left) ; } return root; }
}