二叉树左右节点反转不成功,并且统计叶子节点输出有误
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。如果没有考虑叶子节点为空的情况,可能会导致遗漏统计某些叶子节点,从而导致叶子节点数量的计算有误。