`
huntfor
  • 浏览: 201210 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

[leecode]Unique Binary Search Trees II

 
阅读更多

新博文地址:[leetcode]Unique Binary Search Trees II

 

Unique Binary Search Trees II

Given n, generate all structurally unique BST's (binary search trees) that store values 1...n.

For example,
Given n = 3, your program should return all 5 unique BST's shown below.

1           3    3      2     1
  \          /    /       /  \      \ 
   3      2   1      1   3     2
  /       /      \                    \
2      1       2                    3

 这道题看起来真的挺唬人的。但是搞明白之后还算好,提示中说用DP,但是还是用了DFS,总是感觉DP没法做,可能还是DP不熟吧。

思想是模拟人工建树的过程:

首先,一个节点时,已经好了。

n个节点时候(n > 1),第一个节点的左子树一定为空,同理最后一个节点的右子树一定为空。那么中间节点呢,假设中间节点为k(1<k<n),1~k-1是其左子树,k+1~n是其右子树,然后递归实现1~k-1和k+1~n,典型的分治策略。

	List<TreeNode> result = new ArrayList<TreeNode>();
	public List<TreeNode> generateTrees(int n) {
		if (n <= 0) {
		    result.add(null);//坑爹啊,非要加个null,加你妹啊!!!
			return result;
		}
		return  generateSubTree(1, n);
	}

	private List<TreeNode> generateSubTree(int begin,int end) {
		if (begin == end) {
			List<TreeNode> leaf = new ArrayList<TreeNode>();
			leaf.add(new TreeNode(begin));
			return leaf;
		}
		List<TreeNode> list = new ArrayList<TreeNode>();
		for (int i = begin; i <= end; i++) {
			if (i == begin) {
				List<TreeNode> right = generateSubTree(i + 1, end);
				for (TreeNode tem : right) {
					TreeNode node = new TreeNode(i);
					node.right = tem;
					list.add(node);
				}
			} else if (i == end) {
				List<TreeNode> left = generateSubTree( begin, end - 1);
				for (TreeNode tem : left) {
					TreeNode node = new TreeNode(i);
					node.left = tem;
					list.add(node);
				}
			} else {
				List<TreeNode> left = generateSubTree( begin, i - 1);
				List<TreeNode> right = generateSubTree( i + 1, end);
				for (TreeNode temLeft : left) {
					for (TreeNode temRight : right) {
						TreeNode node = new TreeNode(i);
						node.left = temLeft;
						node.right = temRight;
						list.add(node);
					}
				}
			}
		}
		return list;
	}

 我去,看了别人的代码,貌似都是清一色的分治法,只不过人家的代码简洁多了,果然自己是渣渣

分享到:
评论

相关推荐

    Multidimensional Binary Search Trees Used for Associative Searching

    1975年,来自斯坦福大学的Jon Louis Bentley在ACM杂志上发表的一篇论文:Multidimensional Binary Search Trees Used for Associative Searching 中正式提出和阐述的了把空间划分为多个部分的k-d树。

    python-leetcode题解之095-Unique-Binary-Search-Trees-II

    python python_leetcode题解之095_Unique_Binary_Search_Trees_II

    Self-Adjusting Binary Search Trees (1985)-计算机科学

    Self-Adjusting Binary Search TreesDANIEL DOMINIC SLEATOR A N D ROBERT ENDRE TARJANA T&T Bell Laboratories, Murray Hill, NJAbstract. The splay tree, a self-adjusting form of binary search tree, is ...

    js-leetcode题解之95-unique-binary-search-trees-ii.js

    javascript js_leetcode题解之95-unique-binary-search-trees-ii.js

    c语言-leetcode题解之0095-unique-binary-search-trees-ii.zip

    c语言基础 c语言_leetcode题解之0095_unique_binary_search_trees_ii.zip

    python-leetcode题解之096-Unique-Binary-Search-Trees

    python python_leetcode题解之096_Unique_Binary_Search_Trees

    js-leetcode题解之96-unique-binary-search-trees.js

    javascript js_leetcode题解之96-unique-binary-search-trees.js

    c语言-leetcode题解之0096-unique-binary-search-trees.zip

    c语言基础 c语言_leetcode题解之0096_unique_binary_search_trees.zip

    binary_trees-源码

    二元搜索树(Binary Search Tree, BST)是一种特殊的二元树,其中每个节点的值大于其左子树中的所有节点值,小于其右子树中的所有节点值。BST支持高效的查找、插入和删除操作,时间复杂度可达到O(log n)。 在`...

    折半查找 binarySearch

    A binary search algorithm (or binary chop) is a technique for finding a particular value in a sorted list. It makes progressively better guesses, and closes in on the sought value, by comparing an ...

    你清楚Arrays.binarySearch()方法的返回值吗?

    在Java编程语言中,`Arrays`类是Java.util包下的一个非常重要的工具类,它提供了大量用于操作数组的静态方法,其中包括我们今天要讨论的`binarySearch()`方法。`Arrays.binarySearch()`方法允许我们在有序数组中查找...

    BinarySearch

    标题中的"BinarySearch"指的是二分查找算法,这是一种在有序数组中查找特定元素的搜索算法。它的基本思想是将数组分为三个部分:小于目标值的元素、等于目标值的元素和大于目标值的元素,然后逐步缩小搜索范围,直到...

    Optimal Binary Search Tree

    在Knuth的经典论文《Optimum Binary Search Trees》中,他首先回顾了二叉查找树的基本概念及工作原理,即通过比较节点值来决定搜索方向,从而实现快速查找。具体来说,当需要在一个二叉查找树中查找某个元素时,可以...

    陈越、何钦铭-数据结构作业16:Complete Binary Search Tree完全二叉搜索树

    Both the left and right subtrees must also be binary search trees. A Complete Binary Tree (CBT) is a tree that is completely filled, with the possible exception of the bottom level, which is filled ...

    matlab开发-BinarySearch

    在MATLAB中,二进制搜索(Binary Search)是一种高效查找算法,尤其适用于已排序的数据。这个"matlab开发-BinarySearch"项目提供了一个名为`bsearch.m`的MATLAB函数,用于在向量中执行二进制查找操作。下面我们将...

    Binary_Search_Data.rar_binary_binary search

    - 在`binarySearch`函数中实现上述的二分搜索逻辑,包括计算中间索引、比较元素和更新边界。 总的来说,二分搜索是计算机科学中一种重要的搜索算法,尤其适用于处理大量有序数据。在C语言中实现二分搜索,可以显著...

    二叉搜索树(Binary Search Tree,BST)的实现与操作.docx

    二叉搜索树(Binary Search Tree,BST)的实现与操作.docx 二叉搜索树(Binary Search Tree,BST)的实现与操作.docx 二叉搜索树(Binary Search Tree,BST)的实现与操作.docx 二叉搜索树(Binary Search Tree,BST...

    Search in a Binary Search Tree.zip

    二叉搜索树(Binary Search Tree,BST)是一种特殊类型的二叉树,它的每个节点都包含一个键(key)、一个关联的值、一个指向左子树的引用和一个指向右子树的引用。在二叉搜索树中,对于任意节点,其左子树中的所有...

    BinarySearch_C++_算法_折半查找_

    在这个“BinarySearch_C++_算法_折半查找_”的项目中,我们将会探讨如何使用C++实现这个算法。 首先,我们要明白二分查找的基本思想。假设我们有一个已排序的数组,我们需要查找一个特定值。我们从数组的中间开始...

    matlab开发-Binarysearch

    在MATLAB环境中,二进制搜索(Binary Search)是一种高效的查找算法,主要应用于已排序的数组。本项目“matlab开发-Binarysearch”显然聚焦于如何在MATLAB中实现二进制搜索算法。该算法利用分治思想,通过不断缩小...

Global site tag (gtag.js) - Google Analytics