二叉树左右节点反转不成功,并且统计叶子节点输出有误

问题遇到的现象和发生背景

二叉树左右节点反转不成功,并且统计叶子节点输出有误

用代码块功能插入代码,请勿粘贴截图
class BinTree:
    ''' 二叉树的一种实现方式 '''
    def __init__(self, blist = None, btype = 'DLR'):
        ''' 从前序、中序、后序遍历形式的list构造一棵树。 '''
        if blist is None:
            self._data = None
            self._left = None
            self._right = None
        elif btype == 'DLR':
            self._data = blist[0]
            self._left = BinTree(blist[1], btype = btype) if blist[1] is not None else None
            self._right = BinTree(blist[2], btype = btype) if blist[2] is not None else None
        elif btype == 'LDR':
            self._data = blist[1]
            self._left = BinTree(blist[0], btype = btype) if blist[0] is not None else None
            self._right = BinTree(blist[2], btype = btype) if blist[2] is not None else None
        elif btype == 'LRD':
            self._data = blist[2]
            self._left = BinTree(blist[0], btype = btype) if blist[0] is not None else None
            self._right = BinTree(blist[1], btype = btype) if blist[1] is not None else None
    
    def is_empty(self):
        ''' 判断是否空树 '''
        return self._data is None

    def get_data(self):
        ''' 返回当前节点内的数据 '''
        return self._data

    def get_left(self):
        ''' 返回左子树 '''
        return self._left

    def get_right(self):
        ''' 返回右子树 '''
        return self._right

    def set_data(self, data):
        ''' 设定当前节点内的数据 '''
        self._data = data

    def set_left(self, left):
        ''' 设定左子树 '''
        self._left = left

    def set_right(self, right):
        ''' 设定右子树 '''
        self._right = right

    def to_DLR(self): 
        ''' 前序遍历 '''
        L = self._left.to_DLR() if self._left is not None else None
        R = self._right.to_DLR() if self._right is not None else None
        return [self._data, L, R]

    def to_LDR(self):
        ''' 中序遍历 '''
        L = self._left.to_LDR() if self._left is not None else None
        R = self._right.to_LDR() if self._right is not None else None
        return [L, self._data, R]

    def to_LRD(self):
        ''' 后序遍历 '''
        L = self._left.to_LRD() if self._left is not None else None
        R = self._right.to_LRD() if self._right is not None else None
        return [L, R, self._data]
    
    def inverttree(self): 
        def in_BinTNodes(t):
            if t is None:
                return None
            else:
                self.inverttree(t._left)
                self.inverttree(t._right)
                temp = t._left
                t._left = t._right
                t._right = temp
                return in_BinTNodes(self._root)
    
    def leave(self):
        def count_BinTNodes(t):
            if t is None:
                return 0
            elif t._left is None and t._right is None:
                return 1 
            return count_BinTNodes(self._root)

def flat(blist): 
    ''' 将遍历后的二叉树样式的list转变为正常的list, 并去掉None '''
    res = []
    for i in blist:
        if isinstance(i, list):
            res.extend(flat(i)) # 用递归的方式实现,extend表示在list末尾一次性追加多个值
        elif i is not None:
            res.append(i)       # 递归在这一层终结,如果遇到不是list且不是None的元素,就把它放在列表里
    return res

if __name__ == "__main__":
    a = \
        ['A', ['B', None, None],
              ['C', ['D', ['F', None, None],
                          ['G', None, None]],
                    ['E', ['H', None, None],
                          ['I', None, None]]]]
    ta = BinTree(a) # 默认输入前序list
    DLRlist = ta.to_DLR()
    print('前序(DLR)形式可视化二叉树:%s' % DLRlist)
    tta=ta.inverttree()
    DLRlist2 = ta.to_DLR()
    print('前序(DLR)形式可视化二叉树:%s' % DLRlist2)
    print(ta.leave())

运行结果及报错内容

前序(DLR)形式可视化二叉树:['A', ['B', None, None], ['C', ['D', ['F', None, None], ['G', None, None]], ['E', ['H', None, None], ['I', None, None]]]]
前序(DLR)形式可视化二叉树:['A', ['B', None, None], ['C', ['D', ['F', None, None], ['G', None, None]], ['E', ['H', None, None], ['I', None, None]]]]
None

我的解答思路和尝试过的方法

一开始怀疑是函数运行有误但是尝试更改其他方法之后还是没有成功输出正确的数值

我想要达到的结果

输出结果正确就好

在二叉树左右节点反转过程中,如果反转不成功,可能是由于反转代码有误导致的。
常见的原因包括:

  • 对于根节点,只反转它的左右子节点,但没有对它的子树进行反转。这样,根节点的子树的结构并没有发生变化,导致反转不成功。

  • 在递归过程中,没有考虑当前节点为空的情况。这样,如果当前节点为空,就会导致反转代码无法继续执行,从而导致反转不成功。
    为了解决这个问题,可以对反转代码进行修改,增加对空节点的判断,并在递归时对子树进行反转。

对于统计叶子节点输出有误的情况,可能是由于没有考虑叶子节点为空的情况导致的。如果当前节点的左右子节点都为空,则可以判定当前节点为叶子节点,并将叶子节点数量加1。如果没有考虑叶子节点为空的情况,可能会导致遗漏统计某些叶子节点,从而导致叶子节点数量的计算有误。