建立一棵二叉树,并对其进行三种遍历(先序、中序、后序)操作,输出三种遍历结果,同时算法求解此二叉树的高度和叶子数目。 [基本要求] 从键盘接受树结点序列输入(先序序列输入),以二叉链表作为存储结构建立二
时间: 2023-11-27 09:05:28 浏览: 92
很高兴回答您的问题!为了建立二叉树并进行三种遍历操作,可以使用递归算法来实现。下面是代码实现和注释说明:
```python
# 定义二叉树的结点类
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
# 建立二叉树,输入以先序序列为基础的结点序列(用None表示空结点)
def build_tree(nodes):
if not nodes: # 如果结点序列为空,则返回None
return None
val = nodes.pop(0) # 取出结点序列的第一个元素作为当前结点的值
if val is None: # 如果当前结点的值为None,说明当前结点为空结点
return None
node = TreeNode(val) # 创建当前结点
node.left = build_tree(nodes) # 递归建立左子树
node.right = build_tree(nodes) # 递归建立右子树
return node # 返回当前结点
# 先序遍历二叉树,返回遍历结果
def preorder_traversal(root):
if not root: # 如果当前结点为空,返回空列表
return []
res = [root.val] # 先将当前结点的值加入遍历结果
res += preorder_traversal(root.left) # 递归遍历左子树
res += preorder_traversal(root.right) # 递归遍历右子树
return res
# 中序遍历二叉树,返回遍历结果
def inorder_traversal(root):
if not root: # 如果当前结点为空,返回空列表
return []
res = inorder_traversal(root.left) # 递归遍历左子树
res += [root.val] # 将当前结点的值加入遍历结果
res += inorder_traversal(root.right) # 递归遍历右子树
return res
# 后序遍历二叉树,返回遍历结果
def postorder_traversal(root):
if not root: # 如果当前结点为空,返回空列表
return []
res = postorder_traversal(root.left) # 递归遍历左子树
res += postorder_traversal(root.right) # 递归遍历右子树
res += [root.val] # 将当前结点的值加入遍历结果
return res
# 计算二叉树的高度,返回高度值
def get_height(root):
if not root: # 如果当前结点为空,返回高度0
return 0
left_height = get_height(root.left) # 计算左子树的高度
right_height = get_height(root.right) # 计算右子树的高度
return max(left_height, right_height) + 1 # 返回左右子树高度的最大值加1
# 计算二叉树的叶子数目,返回叶子数目
def get_leaves_num(root):
if not root: # 如果当前结点为空,返回叶子数目0
return 0
if not root.left and not root.right: # 如果当前结点是叶子结点,返回叶子数目1
return 1
left_leaves_num = get_leaves_num(root.left) # 计算左子树的叶子数目
right_leaves_num = get_leaves_num(root.right) # 计算右子树的叶子数目
return left_leaves_num + right_leaves_num # 返回左右子树叶子数目之和
# 从键盘输入以先序序列为基础的结点序列,返回建立的二叉树
def input_tree():
nodes = input().split() # 从键盘输入结点序列,以空格分隔
nodes = [int(x) if x != 'None' else None for x in nodes] # 将结点序列中的字符串'None'替换为None
root = build_tree(nodes) # 建立二叉树
return root
# 主函数
if __name__ == '__main__':
root = input_tree() # 从键盘输入结点序列,建立二叉树
print('先序遍历结果:', preorder_traversal(root)) # 先序遍历二叉树,输出遍历结果
print('中序遍历结果:', inorder_traversal(root)) # 中序遍历二叉树,输出遍历结果
print('后序遍历结果:', postorder_traversal(root)) # 后序遍历二叉树,输出遍历结果
print('二叉树的高度:', get_height(root)) # 计算二叉树的高度,输出高度值
print('二叉树的叶子数目:', get_leaves_num(root)) # 计算二叉树的叶子数目,输出叶子数目
```
运行程序后,您可以从键盘输入以先序序列为基础的结点序列,程序将建立二叉树并进行先序、中序、后序遍历操作,输出遍历结果、二叉树高度和叶子数目。注意,结点序列中用`None`表示空结点,例如输入`1 2 None None 3 4 None None 5 None None`表示如下二叉树:
```
1
/ \
2 3
/ \
4 5
```
希望能够帮到您!
阅读全文