Unique Binary Search Trees II

本文深入探讨了构建含有n个节点的二叉搜索树的算法,通过递归定义和动态规划方法实现。首先解释了二叉搜索树的基本性质,然后介绍了将树根节点变化及左右子树结点数目的转换关系。重点阐述了如何利用这些原理进行动态规划求解,最后展示了复制树节点的函数实现。文章提供了完整的代码示例,清晰地展示了算法的实现过程。

这题首先要明白的是,二叉搜索树的左子树和右子树都自成二叉搜索树。这种递归定义决定了,如果我知道从1到n - 1时,所有的二叉搜索树结构,那结点数为n的二叉搜索树也可以得到了。

转换关系是这样的:

对于一个含有n个结点的二叉搜索树,首先树根可以从i = 1~n变化,然后左右子树的结点数目分别是i - 1和  n- i。

这样分析下来,动态规划的思路就比较明显了。这题麻烦点的是对于一颗树的复制.

TreeNode *copyTree(TreeNode *root, int offSet){
	if (root == nullptr)
		return nullptr;
	TreeNode *nRoot = new TreeNode(root->val + offSet);
	nRoot->left = copyTree(root->left, offSet);
	nRoot->right = copyTree(root->right, offSet);
	return nRoot;
}
    vector<TreeNode *> generateTrees(int n) {
	vector<TreeNode *> result;
	if (n == 0){
		result.push_back(nullptr);
		return result;
	}
	vector<vector<TreeNode*> > table(n + 1);
	TreeNode *t1 = new TreeNode(1);
	table[0] = {nullptr};
	table[1] = {t1};
	for (int i = 2; i < n + 1; i++){
		vector<TreeNode*> row;
		for (int j = 1; j < i + 1; j++){
			//vector<TreeNode*> lt = table[j - 1];//left: no offset
			//vector<TreeNode*> rt = table[i - j];//right: offset by j
			for (auto lIt = table[j - 1].begin();
				lIt != table[j - 1].end(); lIt++){
				for (auto rIt = table[i - j].begin(); rIt != table[i - j].end();
					      rIt++){
					TreeNode *midNode = new TreeNode(j);
					midNode->left = copyTree(*lIt, 0);
					midNode->right = copyTree(*rIt, j);
					row.push_back(midNode);
				}
			}
		}
		table[i] = row;
	}
	return table[n];
    }

  

转载于:https://www.cnblogs.com/hustxujinkang/p/4023166.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值