时间复杂度:O(n)
解题思路
先遍历右孩子最后遍历左孩子的中序遍历法。
这样做的原因是,由于是二叉搜索树,右孩子的值一定大于父节点的值,父节点的值一定大于左孩子的值,要想获得累加树,就必须从最大的结点值开始遍历,并记录下遍历过的所有结点的值的和,将该和加到当前节点值上。而这种遍历顺序刚好就是右孩子优先的中序遍历。
AC代码
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func convertBST(root *TreeNode) *TreeNode {
sum:=0
var dfs func(*TreeNode)
dfs=func(root *TreeNode){
if root==nil{
return
}
dfs(root.Right)
root.Val+=sum
sum=root.Val
dfs(root.Left)
}
dfs(root)
return root
}
感悟
Go的函数值真的是yyds,可以共享函数中的变量,这样就不需要让dfs返回值了,在共享区域内声明一个sum变量即可。