算法篇:树之利用数组处理链表

时间:2022-07-23
本文章向大家介绍算法篇:树之利用数组处理链表,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

算法:

这类题目的一个共同的特点是,转化成数组之后,可以有效的利用数组的有序性来更方便的解决问题。

核心思想是,先利用数据将树变成有序性,然后统一操作有序数组,进行构建;然后再通过数组进行统一操作就可以。

题目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
}

执行结果: