递归中序遍历生成字符串时末尾多余逗号的解决求助
解决递归中序遍历结果末尾多余逗号的问题
嘿,这个末尾多逗号的坑我之前踩过!问题出在咱们递归时给每个节点都加了逗号,最后一个节点也不例外,所以才会多出个尾巴。给你几个实用的解决方案,按简洁可靠程度排序:
方法1:先收集值到列表,再统一格式化(最推荐)
这种方法逻辑最直观,先把所有遍历到的节点值存到列表里,再用字符串工具处理,完全不用担心多余逗号的问题:
def inorder(self): if self.__root is None: return '[ ]' # 递归收集所有节点值到列表 values = self.__inorder(self.__root) # 用', '连接所有元素,再套上括号 return '[ ' + ', '.join(map(str, values)) + ' ]' def __inorder(self, root): rep = [] if root is not None: # 合并左子树的遍历结果 rep.extend(self.__inorder(root.leftC)) rep.append(root.value) # 合并右子树的遍历结果 rep.extend(self.__inorder(root.rightC)) return rep
原理很简单:', '.join()只会在列表的元素之间插入分隔符,不会在最后一个元素后面加逗号,完美解决问题。
方法2:用生成器遍历,再拼接
如果喜欢更简洁的写法,用生成器逐个产生节点值,再用join拼接也是个好选择:
def inorder(self): if self.__root is None: return '[ ]' # 定义生成器函数遍历节点 def traverse(node): if node: yield from traverse(node.leftC) yield str(node.value) yield from traverse(node.rightC) # 把生成器的结果用', '连接 return '[ ' + ', '.join(traverse(self.__root)) + ' ]'
这种写法不需要大幅改动原有的递归逻辑,用生成器替代字符串拼接,代码更清爽。
方法3:直接处理字符串末尾的逗号(不推荐)
如果不想改动递归的核心逻辑,也可以在最后去掉末尾的逗号,但这种方法有点“治标不治本”,万一递归结果为空或者格式变化容易出问题:
def inorder(self): if self.__root == None: return '[ ]' else: raw_result = self.__inorder(self.__root) # 如果结果末尾是', ',就截掉最后两个字符 if raw_result.endswith(', '): raw_result = raw_result[:-2] return '[ ' + raw_result + ']' def __inorder(self, root): rep = '' if root != None: rep = self.__inorder(root.leftC) + str(root.value) + ', ' + self.__inorder(root.rightC) return rep
这种方法虽然能解决当前问题,但如果后续遍历逻辑调整,比如中间出现空节点,可能会出现多个连续逗号的问题,所以还是前两种方法更可靠。
内容的提问来源于stack exchange,提问作者nessa.c
相关产品推荐
相关产品推荐

