7-1 先序序列创建二叉树,输出先序序列、中序序列、后序序列并输出叶子结点数
时间: 2023-04-28 12:02:33 浏览: 175
首先,我们需要了解什么是先序序列、中序序列、后序序列。以一个二叉树为例,先序序列是指先遍历根节点,然后遍历左子树,最后遍历右子树;中序序列是指先遍历左子树,然后遍历根节点,最后遍历右子树;后序序列是指先遍历左子树,然后遍历右子树,最后遍历根节点。
那么,如何通过先序序列创建二叉树呢?我们可以通过递归的方式来实现。具体步骤如下:
1. 如果先序序列为空,则返回空节点。
2. 取出先序序列的第一个元素作为根节点。
3. 在中序序列中找到根节点的位置,将中序序列分为左子树和右子树。
4. 递归创建左子树和右子树。
5. 返回根节点。
下面是代码实现:
```python
class TreeNode:
def __init__(self, val=, left=None, right=None):
self.val = val
self.left = left
self.right = right
def buildTree(preorder, inorder):
if not preorder:
return None
root_val = preorder[]
root = TreeNode(root_val)
idx = inorder.index(root_val)
root.left = buildTree(preorder[1:idx+1], inorder[:idx])
root.right = buildTree(preorder[idx+1:], inorder[idx+1:])
return root
def preorderTraversal(root):
if not root:
return []
res = [root.val]
res += preorderTraversal(root.left)
res += preorderTraversal(root.right)
return res
def inorderTraversal(root):
if not root:
return []
res = inorderTraversal(root.left)
res += [root.val]
res += inorderTraversal(root.right)
return res
def postorderTraversal(root):
if not root:
return []
res = postorderTraversal(root.left)
res += postorderTraversal(root.right)
res += [root.val]
return res
def countLeafNodes(root):
if not root:
return
if not root.left and not root.right:
return 1
return countLeafNodes(root.left) + countLeafNodes(root.right)
preorder = [1, 2, 4, 5, 3, 6, 7]
inorder = [4, 2, 5, 1, 6, 3, 7]
root = buildTree(preorder, inorder)
print("先序序列:", preorderTraversal(root))
print("中序序列:", inorderTraversal(root))
print("后序序列:", postorderTraversal(root))
print("叶子结点数:", countLeafNodes(root))
```
输出结果为:
```
先序序列: [1, 2, 4, 5, 3, 6, 7]
中序序列: [4, 2, 5, 1, 6, 3, 7]
后序序列: [4, 5, 2, 6, 7, 3, 1]
叶子结点数: 4
```
阅读全文