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
42000
代码可运行
举报
文章被收录于专栏:蜉蝣禅修之道蜉蝣禅修之道
运行总次数: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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
c++ LeetCode (网易面试题和链表以及树篇) 五道算法例题代码详解(三)
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
徐飞机
2019/09/23
1.1K0
c++ LeetCode (网易面试题和链表以及树篇)  五道算法例题代码详解(三)
数据结构(8)-- 图解红黑树
红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构。 红黑树是一种平衡二叉查找树的变体,它的左右子树高差有可能大于 1,所以红黑树不是严格意义上的平衡二叉树(AVL),但 对之进行平衡的代价较低, 其平均统计性能要强于 AVL 。 由于每一棵红黑树都是一颗二叉排序树,因此,在对红黑树进行查找时,可以采用运用于普通二叉排序树上的查找算法,在查找过程中不需要颜色信息。
看、未来
2021/09/18
6.9K0
玩转红黑树:手把手教你实现和理解红黑树
相信学习过编程的都或多或多或少的听说过“红黑树”,在了解红黑树之前,需要明白它是一个二叉树,那么在哪些场景/地方使用过红黑树呢?
Lion 莱恩呀
2024/08/19
4530
玩转红黑树:手把手教你实现和理解红黑树
2023-05-10:给你一棵以 root 为根的二叉树和一个 head 为第一个节点的链表 如果在二叉树中,存在一条一直向下的路径 且每个点的数值恰好一一对应
2023-05-10:给你一棵以 root 为根的二叉树和一个 head 为第一个节点的链表
福大大架构师每日一题
2023/05/10
4570
2023-05-10:给你一棵以 root 为根的二叉树和一个 head 为第一个节点的链表 如果在二叉树中,存在一条一直向下的路径 且每个点的数值恰好一一对应
【算法设计题】查找给定结点的双亲结点(二叉树),第3题(C/C++)
该函数 Find_X_Parent 用于在二叉树 T 中查找值为 x 的结点的双亲结点。函数首先定义了一个栈 STACK,用于模拟递归调用栈,并定义了指针 Q 和 P。Q 用于保存当前结点的双亲结点,P 用于遍历树。top 是栈顶指针,初始化为 -1。
命运之光
2024/08/05
2590
程序员进阶之算法练习(九十一)leetcode
题目链接 题目大意: 给定数组 nums 和一个整数 k 。我们将给定的数组 nums 分成 最多 k 个相邻的非空子数组。分数由每个子数组内的平均值的总和构成。 注意我们必须使用 nums 数组中的每一个数进行分组,并且分数不一定需要是整数。 返回我们所能得到的最大 分数 是多少。答案误差在 10 ^ -6 内被视为是正确的。
落影
2023/11/12
2510
程序员进阶之算法练习(九十一)leetcode
【AVL树】—— 我与C++的不解之缘(二十三)
​ 简单来说,AVL树就是一个特殊的搜索二叉树,特殊就特殊在它可以控制平衡,保持左右子树的高度差不超过1。
星辰与你
2025/03/02
1071
【AVL树】—— 我与C++的不解之缘(二十三)
Leetcode: Symmetric Tree
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).
卡尔曼和玻尔兹曼谁曼
2019/01/22
3270
二叉树问题(一)-LeetCode 110、617、101、814、655、98、654(递归思路)
给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1
算法工程师之路
2019/12/24
4890
路径总和题型整理
题型1:easy 深度优先搜索 class Solution { public: bool hasPathSum(TreeNode* root, int targetSum) { if (root == NULL) return false; if (targetSum == root->val && root->left == NULL && root->right == NULL) return true;
大忽悠爱学习
2021/11/15
2450
c++ 哈夫曼树简便构造(数据结构作业篇)
    MinHeapNode(char data, unsigned freq)
星辉
2019/01/15
1.5K0
libuv源码阅读(3)--heap-inl.h
总结:最小时间堆是libuv用来管理 定时器容器的,每个定时器容器以超时时间排序,插入到堆中,每次事件循环中查看是否有超时的定时任务。
wanyicheng
2021/03/06
4400
libuv源码阅读(3)--heap-inl.h
一个简单的二叉搜索树(C++实现)
参考:http://www.cnblogs.com/skywang12345/p/3576373.html
xcywt
2022/05/09
2850
种树:二叉树、二叉搜索树、AVL树、红黑树、哈夫曼树、B树、树与森林
树是我们计算机中非常重要的一种数据结构,同时使用树这种数据结构,可以描述现实生活中的很多事物,例如家 谱、单位的组织架构、等等。 树是由n(n>=1)个有限结点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就 是说它是根朝上,而叶朝下的。
看、未来
2020/08/25
1.2K0
种树:二叉树、二叉搜索树、AVL树、红黑树、哈夫曼树、B树、树与森林
AVL树
二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,导致其效率低下。
DioxideCN
2022/08/05
4090
AVL树
【C++】“旋转!跳跃!我闭着眼!”—— 从零开始构建AVL树
前两篇文章: 【C++】从零开始构建二叉搜索树 【C++】初探 map 与 set 我们学习了二叉搜索树:二叉搜索树虽可以缩短查找的效率,如果数据有序或接近有序二叉搜索树将退化为单支树,这样二叉搜索树效率退化为O(n),不够高效!所以就有了改进版的二叉搜索树->AVL树(平衡二叉搜索树)
叫我龙翔
2024/05/26
1490
【C++】“旋转!跳跃!我闭着眼!”—— 从零开始构建AVL树
三个小时写一个限制扩容的哈希表
话不多说直接贴代码。 说真的,今天听到这个任务的时候我心里一惊,感触颇多。 我想,该把下一个项目(毕设)尽早提上日程了(是时候找老师了)。 #include<vector> /* * 设计思路:哈希表构造时需要传入预期哈希表长度,以及开链法最长链表长度,建议设置8 * 存储哈希节点的数组里存放的是链表的长度,直接开链 * 当链表长度过长的时候将链表转化为AVL树,当链表长度缩减回可容纳范围时将AVL树切换回链表 */ //链表类 class List_Node { public: List_Nod
看、未来
2021/10/15
4390
【数据结构——树】二叉树的性质(头歌实践教学平台习题)【合集】
下面的函数 buildTree 用于根据给定的括号表示串来构建二叉树,思路是通过解析字符串,递归地构建各个节点及其子树
Rossy Yan
2024/12/24
1500
【数据结构——树】二叉树的性质(头歌实践教学平台习题)【合集】
实现一个红黑树
在数据结构中,如果提到编码和压缩绕不开 Hoffman 树,如果从快速获取搜索的树结构那么就离不开红黑树,哈希表设计中,从数组加链表,不行我就数组加红黑树,大名鼎鼎的 epoll 也开始起了红黑树。
ge3m0r
2024/05/29
1710
【C++】AVL树
2. AVL树需要引入一个平衡因子的概念,每个结点都有一个平衡因子,任何结点的平衡因子等于右子树的高度减去左子树的高度,也就是说任何结点的平衡因子等于0、1、-1。 3. AVL树整体结点数量和分布与完全二叉树类似,高度可以控制在log(N),那么增删查改的效率也可以控制在log(N),相比二叉搜索树有了本质的提升。
风中的云彩
2025/05/06
860
【C++】AVL树
推荐阅读
相关推荐
c++ LeetCode (网易面试题和链表以及树篇) 五道算法例题代码详解(三)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验