algorithm6 2023-09-27 10:17 采纳率: 76.2%
浏览 7
已结题

Python编写二叉树和递归报错

我用Python编写二叉树时,代码如下


class Node(object):
    def __init__(self, data=None, lchild=None, rchild=None):
        self.elem = data  # 表示数据域
        self.lchild = lchild  # 表示左子树
        self.rchild = rchild  # 表示右子树

    def PreOrder(self, root):
        if root == None:
            return
        print(root.elem)
        self.PreOrder(root.lchild)  # 先序遍历左子树
        self.PreOrder(root.rchild)  # 先序遍历右子树

    def InOrder(self, root):
        if root == None:
            return
        self.InOrder(root.lchild)  # 中序遍历左子树
        print(root.elem)
        self.InOrder(root.rchild)  # 中序遍历右子树

    def PostOrder(self, root):
        if root == None:
            return
        self.PostOrder(root.lchild)  # 后序遍历左子树
        self.PostOrder(root.rchild)  # 后序遍历右子树
        print(root.elem)

    def breath_travel(self, root):  # 层序遍历
        if root == None:
            return
        queue = []
        queue.append(root)
        while queue:
            node = queue.pop(0)
            print(node.elem)
            if node.lchild != None:
                queue.append(node.lchild)
            if node.rchild != None:
                queue.append(node.rchild)

    def createBiTree(self, root):
        data = input()
        if data == '#':  # 如果当前元素为'#',则认为其为None
            return
        else:
            root.elem = data
            root.lchild = root.createBiTree(root)  # 构造左子树
            root.rchild = root.createBiTree(root)  # 构造右子树
        return root


root = Node()  # 创建根节点

root.createBiTree(root)  # 构造整个二叉树

# 遍历二叉树
root.PreOrder(root)  # 先序遍历
root.InOrder(root)  # 中序遍历
root.PostOrder(root)  # 后序遍历
root.breath_travel(root)  # 层序遍历

输入:

img


然后发现递归出错

img


同时遍历输入结果如下:

img


请问要怎么修改

  • 写回答

5条回答 默认 最新

  • CSDN专家-sinJack 2023-09-27 10:53
    关注
    RecursionError: maximum recursion depth exceeded while calling a Python object
    

    这个错误是因为递归调用的层数超过了最大限制,没有合适的终止条件,因为递归函数中传递了自身节点root,导致死递归了。
    创建新节点,参数应该是Node(),跟第一次创建root根节点一样的。

     
    class Node(object):
        def __init__(self, data=None, lchild=None, rchild=None):
            self.elem = data  # 表示数据域
            self.lchild = lchild  # 表示左子树
            self.rchild = rchild  # 表示右子树
     
        def PreOrder(self, root):
            if root == None:
                return
            print(root.elem)
            self.PreOrder(root.lchild)  # 先序遍历左子树
            self.PreOrder(root.rchild)  # 先序遍历右子树
     
        def InOrder(self, root):
            if root == None:
                return
            self.InOrder(root.lchild)  # 中序遍历左子树
            print(root.elem)
            self.InOrder(root.rchild)  # 中序遍历右子树
     
        def PostOrder(self, root):
            if root == None:
                return
            self.PostOrder(root.lchild)  # 后序遍历左子树
            self.PostOrder(root.rchild)  # 后序遍历右子树
            print(root.elem)
     
        def breath_travel(self, root):  # 层序遍历
            if root == None:
                return
            queue = []
            queue.append(root)
            while queue:
                node = queue.pop(0)
                print(node.elem)
                if node.lchild != None:
                    queue.append(node.lchild)
                if node.rchild != None:
                    queue.append(node.rchild)
     
        def createBiTree(self, root):
            data = input()
            if data == '#':  # 如果当前元素为'#',则认为其为None
                return
            else:
                root.elem = data
                root.lchild = root.createBiTree(Node())  # 构造左子树
                root.rchild = root.createBiTree(Node())  # 构造右子树
            return root
     
     
    root = Node()  # 创建根节点
     
    root.createBiTree(root)  # 构造整个二叉树
     
    # 遍历二叉树
    root.PreOrder(root)  # 先序遍历
    root.InOrder(root)  # 中序遍历
    root.PostOrder(root)  # 后序遍历
    root.breath_travel(root)  # 层序遍历
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 10月5日
  • 已采纳回答 9月27日
  • 创建了问题 9月27日

悬赏问题

  • ¥15 三极管电路求解,已知电阻电压和三级关放大倍数
  • ¥15 ADS时域 连续相位观察方法
  • ¥15 Opencv配置出错
  • ¥15 模电中二极管,三极管和电容的应用
  • ¥15 关于模型导入UNITY的.FBX: Check external application preferences.警告。
  • ¥15 气象网格数据与卫星轨道数据如何匹配
  • ¥100 java ee ssm项目 悬赏,感兴趣直接联系我
  • ¥15 微软账户问题不小心注销了好像
  • ¥15 x264库中预测模式字IPM、运动向量差MVD、量化后的DCT系数的位置
  • ¥15 curl 命令调用正常,程序调用报 java.net.ConnectException: connection refused