题目描述:
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合
例如:当n=1 时,有效的括号组合['()']
当n=2时,有效的括号组合['(())','()()']
当n=3时,有效的括号组合有['((()))','(()())','(())()'.'()(())','()()()']
解题思路:先递归生成n个左括号(,再递归生成n个右括号),之后回溯到两个左括号((, 一个左括号(,回溯的过程有点类似深度优先遍历,先遍历完左子树入栈,再根据栈顶元素(出栈的元素)访问其右子树节点,知道所有的结点都遍历完成。
核心代码:
闲来无事,一直想把递归的详细过程写一遍,正好趁这次机会,将上述代码的执行过程写在了下方。
运行过程:
(数字表示的是给递归次序标上序号,方便观察,退栈到第几次递归。)
左括号一直到((( 三次递归 123
之后进入第二个if条件,))) 三次递归 456
此时满足出口条件:输出((()))
之后递归函数出栈,执行ss.delete(ss.length()-1) 此时ss=((()),一直退完第二次的三次递归,退456,ss的结果为(((
此时开始退第一个的3递归,执行ss.deletecharat(ss.length-1),结果为((,后接着判断第二个if条件,成立,追加一个),ss=((), 入栈一次7递归(下一条是第二个if的ss.delete语句),第一个if条件成立,追加一个左括号,ss=(()(, 入栈一个8递归(下一条是第一个if的ss.delete语句),此次递归判断第一个if不满足,满足第二个if,ss追加,ss=(()(),进入一个9递归语句(下一条是第二个if条件的ss.delete),此次递归进入第二个if条件,ss=(()()), 此时进入右一个10递归(下一条是第二个if条件的ss.length-1),此次递归满足出口,输出ss(()())
开始退栈:ss的变化:(()())->(()()->(()(->(() 到第8个递归这里,因为rightBracket<LeftBracket,
进入第二个if条件,ss追加),ss=(()),进入第11个递归(下一条语句是第二个if条件的ss.delete语句),此次递归满足第一个if语句,ss追加(,值为(())(,进入递归12(下一条是第一个if条件的ss.deletechar语句),此次递归进入第二个if判断条件,ss追加),结果为(())(),
进入第13个递归,此时递归满足出口条件,输出结果(())()
开始退栈:ss的变化:(())()->(())(->(())->(()->((,退到第2个递归,ss结果为((,接着进入第二个if条件判断,ss追加),结果为((),进入第14个递归(下一条是第二个if判断条件的ss.delete语句),此次递归进入第一个if判断条件,ss追加(,ss结果为(()(,进入第15个递归(下一条是从第一个if条件下的ss.delete语句),此次递归进入第二个if判断条件下,ss追加),ss结果为(()(),进入第16次递归(下一条从第二个ss.delete开始),此次递归进入第二个if判读,ss追加),结果为(()()),进入第17次递归,此次递归满足出口条件,输出结果(()())
开始退栈:ss变化(()())->(()()->(()(->(()->(:推到第1个递归,第一个if条件的ss.delete执行后,ss结果为(,此时程序进入第二个if判断条件,ss追加(),进入第18个递归(下一条语句是第二个if条件的ss.delete语句),进入第一个if判断条件,ss追加(,值为()(,
进入第19个递归(下一条语句是第一个if判断条件下的ss.delete语句),此时递归进入第一个if条件语句,ss追加(,值为()((,进入第20个递归(下一条语句是第一个if判断条件下的ss.delete语句),此次递归进入第二个if判断条件,ss追加),值为()((),进入第21个递归(下一条语句是第二个if判断条件下的ss.delete语句),此次递归进入第二个if判断条件,ss追加),值为()(()),进入第22次递归,此次递归满足出口条件,输出结果()(())。
第22次执行结果,返回,开始退栈,返回到第17次递归继续执行,ss结果为()((),第21次结束,返回到20次递归继续执行,结果为()((, 返回到第19次递归,执行deletechar结果为()(,此时进入第二个if条件,ss追加),结果为()(),进入第23次递归(下一条是第二个if的ss.delete语句),此次递归进入第一个if判断条件,ss追加(,ss结果为()()(,进入第24次递归,此次递归进入第二个if判断条件,ss追加),ss值为()()(),进入第25次递归,此次递归正好满足出口,输出结果()()()
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/caixiaoshu/article/details/138716923
标签:语句,递归,第二个,ss,条件,括号,回溯,delete From: https://www.cnblogs.com/Cailulian/p/18186783