算法:
这类题目的一个共同的特点是,转化成数组之后,可以有效的利用数组的有序性来更方便的解决问题。
核心思想是,先利用数据将树变成有序性,然后统一操作有序数组,进行构建;然后再通过数组进行统一操作就可以。
题目1:
https://leetcode-cn.com/problems/flatten-binary-tree-to-linked-list/
代码实现:
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func flatten(root *TreeNode) {
// 1. 将树变成数组,利用数组的有序性
l := preOrder(root)
if l == nil {
return
}
// 2. 将有序数组统一构建成一个链式的树结构
for i:=1; i< len(l);i++ { // 这里要注意的是i 从1 开始,因为我们用到了i-1做前缀
pre,cur := l[i-1],l[i]
pre.Left = nil
pre.Right = cur
}
return
}
func preOrder(root *TreeNode) []*TreeNode {
if root == nil {
return nil
}
res := []*TreeNode{}
res = append(res,root)
l := preOrder(root.Left)
res = append(res,l...)
r := preOrder(root.Right)
res = append(res,r...)
return res
}
// 算法:
// 核心思想是,先利用数据将树变成有序性,然后统一操作有序数组,进行构建
执行结果:
题目2:
这个题目可以通过数组的有序性来操作,表现虽然没有那么好,不过还是想把这个解法写了下来,用来表明数组的用途。
https://leetcode-cn.com/problems/convert-bst-to-greater-tree/
代码实现:
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func convertBST(root *TreeNode) *TreeNode {
l := midOrder(root)
if l == nil {
return nil
}
sum := 0
for i:=len(l)-1;i>=0;i-- {
l[i].Val += sum
sum = l[i].Val
}
return root
}
func midOrder(root *TreeNode) []*TreeNode {
if root == nil {
return nil
}
res := []*TreeNode{}
l := midOrder(root.Left)
res = append(res,l...)
res = append(res,root)
r := midOrder(root.Right)
res = append(res,r...)
return res
}
执行结果: