
时间复杂度: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变量即可。

本文介绍了如何通过中序遍历将二叉搜索树转换为累加树,利用Go语言实现。解题关键在于右孩子优先的中序遍历,确保节点值累加上所有大于它的祖先节点值。Go的函数值特性使得在遍历过程中共享变量变得简单。
661

被折叠的 条评论
为什么被折叠?



