• leetcode 95. Unique Binary Search Trees II


    实现思路:分治:先建立左子树,再建立右子树,然后合并两种情况。

    /**
     * Definition for a binary tree node.
     * type TreeNode struct {
     *     Val int
     *     Left *TreeNode
     *     Right *TreeNode
     * }
     */
    func generateTrees(n int) []*TreeNode {
        if n < 1 {
            return nil
        }
        return createTrees(1, n)
    }
    
    func createTrees(begin int, end int) []*TreeNode {
        var trees []*TreeNode
        if begin > end {
            trees = append(trees, nil)
        }
        for i := begin; i <= end; i++ {
            leftTrees := createTrees(begin, i-1)
            rightTrees := createTrees(i+1, end)
            for _, left := range leftTrees {
                for _, right := range rightTrees {
                    root := TreeNode{i, left, right}
                    trees = append(trees, &root)
                }
            }
        }
        return trees
    }

    由于左子树和右子树是相互独立的子问题,那么其实可以同时进行,使用goroutine来实现:

    package main
    
    import "fmt"
    
    // Definition for a binary tree node.
    type TreeNode struct {
        Val   int
        Left  *TreeNode
        Right *TreeNode
    }
    
    func generateTrees(n int) []*TreeNode {
        begin := make(chan int, 1)
        end := make(chan int, 1)
        result := make(chan []*TreeNode)
        // var resultArr []*TreeNode
        if n < 1 {
            return nil
        }
        begin <- 1
        end <- n
        go createTrees(begin, end, result)
        myresult := <-result
        return myresult
    }
    
    func createTrees(begin chan int, end chan int, treesChan chan []*TreeNode) {
        // var trees []*TreeNode
        leftTrees := make(chan []*TreeNode)
        rightTrees := make(chan []*TreeNode)
        mid := make(chan int, 1)
        var rootset, leftTreesR, rightTreesR []*TreeNode
        b := <-begin
        e := <-end
        if b > e {
            rootset = append(rootset, nil)
        }
    
        for i := b; i <= e; i++ {
            mid <- (i - 1)
            begin <- b
            go createTrees(begin, mid, leftTrees)
            mid <- (i + 1)
            end <- e
            go createTrees(mid, end, rightTrees)
            leftTreesR = <-leftTrees
            rightTreesR = <-rightTrees
            for _, left := range leftTreesR {
                for _, right := range rightTreesR {
                    root := TreeNode{i, left, right}
                    rootset = append(rootset, &root)
                }
            }
        }
        treesChan <- rootset
    }
    
    func main() {
        trees := generateTrees(20)
        for _, value := range trees {
            fmt.Println(value)
        }
    }
  • 相关阅读:
    【刷题】LOJ 6009 「网络流 24 题」软件补丁
    lab 项目
    js内的时间戳指的是当前时间到1970年1月1日00:00:00 UTC对应的毫秒数,和 unix时间戳是对应的秒数,差了1000倍
    js 原生: 身份证脱敏、唯一随机字符串uuid、对于高 index 元素的隐藏与显示
    diy 滚动条 样式 ---- 核心代码
    PC_后台管理系统
    三端兼容项目
    阿里小程序
    到位App_jQuery_art-template
    一步一步 copy163: 网易严选 ---- vue-cli
  • 原文地址:https://www.cnblogs.com/Spider-spiders/p/10489011.html
Copyright © 2020-2023  润新知