问题遇到的现象和发生背景
二叉树左右节点反转不成功,并且统计叶子节点输出有误
用代码块功能插入代码,请勿粘贴截图
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
我的解答思路和尝试过的方法
一开始怀疑是函数运行有误但是尝试更改其他方法之后还是没有成功输出正确的数值
我想要达到的结果
输出结果正确就好