Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >LeetCode之Generate Parentheses(C++)

LeetCode之Generate Parentheses(C++)

作者头像
forrestlin
发布于 2018-05-24 03:25:40
发布于 2018-05-24 03:25:40
43100
代码可运行
举报
文章被收录于专栏:蜉蝣禅修之道蜉蝣禅修之道
运行总次数:0
代码可运行

题目:Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.

For example, given n = 3, a solution set is:

"((()))", "(()())", "(())()", "()(())", "()()()"

目标:生成正确的括号对

数据结构:采用二叉树结构,每个节点的value是“(”或“)”,节点结构包括左右孩子节点,父节点,val,栈顶节点,剩下可使用的“(”的数量count,代码表示如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        struct TreeNode{
		TreeNode* left,*right,*parent,*top;
		char val;
		int count;
		TreeNode(char v):val(v),top(NULL),left(NULL),right(NULL),parent(NULL),count(0){};
		TreeNode(char v,TreeNode* p):val(v),top(NULL),left(NULL),right(NULL),parent(p),count(0){};
	};

算法思路:当当前节点的栈顶节点为“(”时,可以插入右子节点“)”,此时若count大于0,还可以插入左子节点“(”,当栈顶节点为空时,且count大于0,那么可以插入左子节点“(”,否则只能返回。以上插入完子节点后均可以继续递归。完整代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
public:
	struct TreeNode{
		TreeNode* left,*right,*parent,*top;
		char val;
		int count;
		TreeNode(char v):val(v),top(NULL),left(NULL),right(NULL),parent(NULL),count(0){};
		TreeNode(char v,TreeNode* p):val(v),top(NULL),left(NULL),right(NULL),parent(p),count(0){};
	};
	void generateTree(TreeNode* node){
		if(node->top){
			if(node->count>0){
				node->left=new TreeNode('(',node);
				node->left->count=node->count-1;
				node->left->top=node->left;
				generateTree(node->left);
				node->right=new TreeNode(')',node);
				node->right->count=node->count;
				if(node->top->parent)
					node->right->top=node->top->parent->top;
				generateTree(node->right);
			}else{
				node->right=new TreeNode(')',node);
				node->right->count=node->count;
				if(node->top->parent)
					node->right->top=node->top->parent->top;
				generateTree(node->right);
			}
		}else{
			if(node->count>0){
				node->left=new TreeNode('(',node);
				node->left->count=node->count-1;
				node->left->top=node->left;
				generateTree(node->left);
			}else{
				return;
			}
		}
	}
	void traverseTree(TreeNode* node,vector<string>& results,string upStr){
		if(!node->left&&!node->right){
			ostringstream ostr;
			ostr<<upStr;
			ostr.put(node->val);
			results.push_back(ostr.str());
			return;
		}
		if(node->left){
			ostringstream ostr;
			ostr<<upStr;
			ostr.put(node->val);
			traverseTree(node->left,results,ostr.str());
		}
		if(node->right){
			ostringstream ostr;
			ostr<<upStr;
			ostr.put(node->val);
			traverseTree(node->right,results,ostr.str());
		}
	}
    vector<string> generateParenthesis(int n) {
        vector<string> results;
		if(n==0)
			return results;
		TreeNode* head=new TreeNode('(');
		head->count=n-1;
		head->top=head;
		generateTree(head);
		traverseTree(head,results,"");
		return results;
    }
};

笔者认为数据结构设计的有些冗余,而且两次使用递归(生成括号和遍历括号树),希望各位技术大牛加以指正,万分感谢。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015年10月27日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
数据结构(8)-- 图解红黑树
红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构。 红黑树是一种平衡二叉查找树的变体,它的左右子树高差有可能大于 1,所以红黑树不是严格意义上的平衡二叉树(AVL),但 对之进行平衡的代价较低, 其平均统计性能要强于 AVL 。 由于每一棵红黑树都是一颗二叉排序树,因此,在对红黑树进行查找时,可以采用运用于普通二叉排序树上的查找算法,在查找过程中不需要颜色信息。
看、未来
2021/09/18
7.9K0
程序员进阶之算法练习(九十一)leetcode
题目链接 题目大意: 给定数组 nums 和一个整数 k 。我们将给定的数组 nums 分成 最多 k 个相邻的非空子数组。分数由每个子数组内的平均值的总和构成。 注意我们必须使用 nums 数组中的每一个数进行分组,并且分数不一定需要是整数。 返回我们所能得到的最大 分数 是多少。答案误差在 10 ^ -6 内被视为是正确的。
落影
2023/11/12
2650
程序员进阶之算法练习(九十一)leetcode
c++ LeetCode (网易面试题和链表以及树篇) 五道算法例题代码详解(三)
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
徐飞机
2019/09/23
1.1K0
c++ LeetCode (网易面试题和链表以及树篇)  五道算法例题代码详解(三)
【算法设计题】查找给定结点的双亲结点(二叉树),第3题(C/C++)
该函数 Find_X_Parent 用于在二叉树 T 中查找值为 x 的结点的双亲结点。函数首先定义了一个栈 STACK,用于模拟递归调用栈,并定义了指针 Q 和 P。Q 用于保存当前结点的双亲结点,P 用于遍历树。top 是栈顶指针,初始化为 -1。
命运之光
2024/08/05
2720
AVL树
二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,导致其效率低下。
DioxideCN
2022/08/05
4200
AVL树
2023-05-10:给你一棵以 root 为根的二叉树和一个 head 为第一个节点的链表 如果在二叉树中,存在一条一直向下的路径 且每个点的数值恰好一一对应
2023-05-10:给你一棵以 root 为根的二叉树和一个 head 为第一个节点的链表
福大大架构师每日一题
2023/05/10
4650
2023-05-10:给你一棵以 root 为根的二叉树和一个 head 为第一个节点的链表 如果在二叉树中,存在一条一直向下的路径 且每个点的数值恰好一一对应
数据结构(7)-- Splay tree(伸展树)
现在我们来介绍一种相对与AVL树更简单的数据结构,它叫伸展树,它保证从空树开始连续任意M次操作最多花费O(MlogN)时间。虽然这种保证并不排除任一次操作花费的时间为O(N),但是我们关注的是最终的结果。
看、未来
2021/09/18
1K0
【代码随想录】二刷-二叉树
二叉树中章节中,相对于迭代,递归有时候会更好理解,部分题用到了马上要刷的回溯算法。
半生瓜的blog
2023/05/13
8670
【代码随想录】二刷-二叉树
2023-06-14:我们从二叉树的根节点 root 开始进行深度优先搜索。 在遍历中的每个节点处,我们输出 D 条短划线(其中
2.定义一个结构体类型 TreeNode,表示二叉树的节点,包括节点值 Val,左子节点 Left,右子节点 Right。
福大大架构师每日一题
2023/06/21
3210
2023-06-14:我们从二叉树的根节点 root 开始进行深度优先搜索。 在遍历中的每个节点处,我们输出 D 条短划线(其中
数据结构(5)-- 图解AVL树(平衡二叉搜索树)
二叉搜索树一定程度上可以提高搜索效率,但是当原序列有序,例如序列A = {1,2,3,4,5,6},构造二叉搜索树如图。依据此序列构造的二叉搜索树为右斜树,同时二叉树退化成单链表,搜索效率降低为O(n)。
看、未来
2021/09/18
6320
leetcode-树 tree
使用递归,由叶子结点到根结点,每个结点都返回自己所能贡献的最大直径。设一个全局变量用来在过程中更新diameter。
孔西皮
2021/03/04
5130
leetcode-树 tree
种树:二叉树、二叉搜索树、AVL树、红黑树、哈夫曼树、B树、树与森林
树是我们计算机中非常重要的一种数据结构,同时使用树这种数据结构,可以描述现实生活中的很多事物,例如家 谱、单位的组织架构、等等。 树是由n(n>=1)个有限结点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就 是说它是根朝上,而叶朝下的。
看、未来
2020/08/25
1.2K0
种树:二叉树、二叉搜索树、AVL树、红黑树、哈夫曼树、B树、树与森林
【AVL树】—— 我与C++的不解之缘(二十三)
​ 简单来说,AVL树就是一个特殊的搜索二叉树,特殊就特殊在它可以控制平衡,保持左右子树的高度差不超过1。
星辰与你
2025/03/02
1221
【AVL树】—— 我与C++的不解之缘(二十三)
一个简单的二叉搜索树(C++实现)
参考:http://www.cnblogs.com/skywang12345/p/3576373.html
xcywt
2022/05/09
2920
PHP二叉树(三):红黑树
红黑树 <?php /** * description: 红黑树 */ //结点 class Node { public $key; public $parent; pub
guanguans
2018/05/09
1.4K0
【数据结构——树】二叉树的性质(头歌实践教学平台习题)【合集】
下面的函数 buildTree 用于根据给定的括号表示串来构建二叉树,思路是通过解析字符串,递归地构建各个节点及其子树
Rossy Yan
2024/12/24
1650
【数据结构——树】二叉树的性质(头歌实践教学平台习题)【合集】
LeetCode 高频 50 题:最优解笔记(附题解)
题目描述: 给定整数数组 nums 和目标值 target,在数组中找出和为目标值的两个整数,返回它们的索引。 示例: 输入:nums = [2,7,11,15], target = 9 输出:[0,1] 最优解思路: 使用哈希表存储元素值到索引的映射。遍历数组,对于每个元素 num,检查 target - num 是否在哈希表中。若存在则返回结果,否则将当前元素加入哈希表。 时间复杂度:O(n) 空间复杂度:O(n)
大熊计算机
2025/07/15
4800
二叉树:递归函数究竟什么时候需要返回值,什么时候不要返回值?
给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。
代码随想录
2020/10/10
2.4K0
二叉树:递归函数究竟什么时候需要返回值,什么时候不要返回值?
2023-05-03:给你一棵 二叉树 的根节点 root ,树中有 n 个节点 每个节点都可以被分配一个从 1 到 n 且互不相同的值 另给你一个长度为 m
返回一个长度为 m 的数组 answer ,其中 answeri 是执行第 i 个查询后树的高度。
福大大架构师每日一题
2023/05/03
3980
2023-05-03:给你一棵 二叉树 的根节点 root ,树中有 n 个节点 每个节点都可以被分配一个从 1 到 n 且互不相同的值 另给你一个长度为 m
libuv源码阅读(3)--heap-inl.h
总结:最小时间堆是libuv用来管理 定时器容器的,每个定时器容器以超时时间排序,插入到堆中,每次事件循环中查看是否有超时的定时任务。
wanyicheng
2021/03/06
4510
libuv源码阅读(3)--heap-inl.h
推荐阅读
数据结构(8)-- 图解红黑树
7.9K0
程序员进阶之算法练习(九十一)leetcode
2650
c++ LeetCode (网易面试题和链表以及树篇) 五道算法例题代码详解(三)
1.1K0
【算法设计题】查找给定结点的双亲结点(二叉树),第3题(C/C++)
2720
AVL树
4200
2023-05-10:给你一棵以 root 为根的二叉树和一个 head 为第一个节点的链表 如果在二叉树中,存在一条一直向下的路径 且每个点的数值恰好一一对应
4650
数据结构(7)-- Splay tree(伸展树)
1K0
【代码随想录】二刷-二叉树
8670
2023-06-14:我们从二叉树的根节点 root 开始进行深度优先搜索。 在遍历中的每个节点处,我们输出 D 条短划线(其中
3210
数据结构(5)-- 图解AVL树(平衡二叉搜索树)
6320
leetcode-树 tree
5130
种树:二叉树、二叉搜索树、AVL树、红黑树、哈夫曼树、B树、树与森林
1.2K0
【AVL树】—— 我与C++的不解之缘(二十三)
1221
一个简单的二叉搜索树(C++实现)
2920
PHP二叉树(三):红黑树
1.4K0
【数据结构——树】二叉树的性质(头歌实践教学平台习题)【合集】
1650
LeetCode 高频 50 题:最优解笔记(附题解)
4800
二叉树:递归函数究竟什么时候需要返回值,什么时候不要返回值?
2.4K0
2023-05-03:给你一棵 二叉树 的根节点 root ,树中有 n 个节点 每个节点都可以被分配一个从 1 到 n 且互不相同的值 另给你一个长度为 m
3980
libuv源码阅读(3)--heap-inl.h
4510
相关推荐
数据结构(8)-- 图解红黑树
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档