编写二叉树的递归遍历算法,实现:给定一棵二叉树的“扩展先序遍历序列”,创建这棵 二叉树 (1)输出二叉树的先序遍历的结点序列。 (2)输出二叉树的后序遍历的结点序列。 (3)输出二叉树的中序遍历的结点序列。 (4)输出二叉树的叶子结点。 (5)统计二叉树的结点个数。
时间: 2023-10-18 15:07:41 浏览: 100
好的,我知道了。
首先,我们需要解释一下“扩展先序遍历序列”的概念。具体来说,它是一个由二叉树中所有节点组成的字符串,其中每个节点的表示方式为:
- 如果节点为空,用字符“#”表示。
- 如果节点非空,先输出节点的值,然后紧跟着用小括号将其左子树和右子树连接起来。
例如,一棵如下图所示的二叉树的扩展先序遍历序列为“1(2(4)(5))(3(6)(7))”。
```
1
/ \
2 3
/ \ / \
4 5 6 7
```
接下来,我们可以按照如下步骤编写递归遍历算法:
1. 先把扩展先序遍历序列中的第一个节点取出来,如果这个节点是空节点,直接返回;否则,我们可以按照小括号的位置将其左子树和右子树分离出来。
2. 对于当前的节点,先输出它的值,并把它加入相应的遍历序列中(例如先序遍历序列、后序遍历序列、中序遍历序列等)。
3. 分别对当前节点的左子树和右子树进行递归遍历。
接下来我们可以按照上述方法来实现二叉树的递归遍历算法,具体代码如下:
```python
# 定义二叉树的节点类
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution:
def createTree(self, s: str) -> TreeNode:
# 根据扩展先序遍历序列创建二叉树
if not s:
return None
if s[0] == '#':
return None
val = s.split('(')[0]
root = TreeNode(int(val))
stack = [root]
i = 1
while i < len(s):
if s[i] == '(':
parent = stack[-1]
i += 1
val = s[i:].split('(')[0]
child = None if val == '#' else TreeNode(int(val))
if not parent.left:
parent.left = child
else:
parent.right = child
if child:
stack.append(child)
elif s[i] == ')':
stack.pop()
i += 1
return root
def preorderTraversal(self, root: TreeNode) -> List[int]:
# 先序遍历
res = []
def helper(node):
if not node:
return
res.append(node.val)
helper(node.left)
helper(node.right)
helper(root)
return res
def postorderTraversal(self, root: TreeNode) -> List[int]:
# 后序遍历
res = []
def helper(node):
if not node:
return
helper(node.left)
helper(node.right)
res.append(node.val)
helper(root)
return res
def inorderTraversal(self, root: TreeNode) -> List[int]:
# 中序遍历
res = []
def helper(node):
if not node:
return
helper(node.left)
res.append(node.val)
helper(node.right)
helper(root)
return res
def leafNodes(self, root: TreeNode) -> List[int]:
# 叶子节点
res = []
def helper(node):
if not node:
return
if not node.left and not node.right:
res.append(node.val)
return
helper(node.left)
helper(node.right)
helper(root)
return res
def countNodes(self, root: TreeNode) -> int:
# 统计节点个数
if not root:
return 0
return self.countNodes(root.left) + self.countNodes(root.right) + 1
```
这样,我们就完成了对于二叉树的递归遍历算法的实现,并实现了五个不同的操作:先序遍历、后序遍历、中序遍历、叶子节点、节点个数统计。如果你有更深入的问题需要解决,欢迎继续与我交流哦!
阅读全文