3

[leetcode]95.不同的二叉搜索树 - Yangsc_o

 1 year ago
source link: https://www.cnblogs.com/yangsanchao/p/16804170.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

[leetcode]95.不同的二叉搜索树


95. 不同的二叉搜索树 II

给你一个整数 n ,请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同 二叉搜索树 。可以按 任意顺序 返回答案。

示例 1:

image.png
输入:n = 3
输出:[[1,null,2,null,3],[1,null,3,2],[2,1,3],[3,1,null,null,2],[3,2,null,1]]
输入:n = 1
输出:[[1]]
1 <= n <= 8

解析:
先看如何构造一颗平衡二叉搜索树

func generateTrees(n int) *TreeNode {
	return helper(1, n)
}

func helper(start, end int) *TreeNode {
	if start > end {
		return nil
	}
        // 平衡二叉搜索树
	i := (start + end) / 2
	root := &TreeNode{Val: i}
	root.Left = helper(start, i-1)
	root.Right = helper(i+1, end)
	return root
}

根据题目的意思,需要在上面的代码中,在选择根结点的时候,遍历跟节点所有的可能;
即:i := (start + end) / 2 的可能值为从start到end

	for  i := start; i <= end; i++{
		root := &TreeNode{Val: i};
	}

当找到root节点时,问题就变为如何构建root的左右子树。
固定左孩子,遍历右孩子

	for _, leftNode := range left {
		for _, rightNode := range right {
			root := &TreeNode{Val: i}
			root.Left = leftNode
			root.Right = rightNode
		}
	}
/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func generateTrees(n int) []*TreeNode {
    return helper(1,n)
}

func helper(start,end int) []*TreeNode {
    res := make([]*TreeNode, 0)
    if start > end {
        res = append(res, nil)
        return res
    }
    // 1.穷举所有以 i 为 root 节点的所有可能
    for i:= start; i <= end;i ++ {
        left := helper(start,i - 1)
        right := helper(i + 1 ,end)
        // 2.递归所有 root 节点的左右子树
        for _, leftNode := range left {
            for _, rightNode := range right {
                 // 3.给 root 节点穷举所有左右子树的组合
                root := &TreeNode{Val: i}
                root.Left = leftNode
                root.Right = rightNode
                res = append(res, root)
            }
        }
    }
    return res
}

Krains's Blog-不同的二叉搜索树 II

你的鼓励也是我创作的动力

打赏地址


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK