已知一棵树的由根至叶子结点按层次输入的结点序列及每个结点的度 (每层中自左至右输入),试写出构造此树的孩子-兄弟链表的算法。 输入:一个正整数N结点数;然后输入N行,每行输入两个数字,中间用空格分开,代表节点及其对应的度。 输出:若该树有M个叶结点,则输出M行,每行是一条从根到叶子结点的路径,然后按照先序遍历的方式输出每一行。
时间: 2024-03-27 09:38:06 浏览: 137
以下是构造孩子-兄弟链表并输出路径和遍历顺序的完整代码实现:
```python
class Node:
def __init__(self, val):
self.val = val
self.child = None
self.sibling = None
def build_tree(n, nodes):
roots = [None] * n
for i in range(n):
node, degree = nodes[i]
roots[node] = Node(node)
child_index = i + 1
for j in range(degree):
child_node, child_degree = nodes[child_index]
child = Node(child_node)
sibling = roots[node].child
if sibling is None:
roots[node].child = child
else:
while sibling.sibling:
sibling = sibling.sibling
sibling.sibling = child
roots[child_node] = child
child_index += 1
return roots[0]
def get_leaves_path(root):
result = []
path = []
def dfs(node):
path.append(node.val)
if node.child is None:
result.append(path[:])
else:
dfs(node.child)
path.pop()
if node.sibling:
dfs(node.sibling)
dfs(root)
return result
def preorder_traversal(root):
if not root:
return []
result = [root.val]
result += preorder_traversal(root.child)
result += preorder_traversal(root.sibling)
return result
n = int(input())
nodes = [list(map(int, input().split())) for _ in range(n)]
root = build_tree(n, nodes)
leaves_path = get_leaves_path(root)
for path in leaves_path:
print(' '.join(map(str, path)))
print(' '.join(map(str, preorder_traversal(root))))
```
在这个实现中,`build_tree`函数构建孩子-兄弟链表,接收两个参数:结点个数`n`和每个结点的编号及度数的列表`nodes`。函数首先创建一个长度为`n`的列表`roots`,用于保存每个结点的根节点。然后对于每个结点,遍历其子结点并将其链接到孩子链表中,同时更新`roots`列表中的根节点。最后返回根节点。
`get_leaves_path`函数用于获取从根节点到每个叶子节点的路径。函数首先定义了一个空列表`result`,用于保存所有路径。然后定义了一个内部函数`dfs`,使用深度优先遍历的方式遍历树,并将遍历路径保存到`path`列表中。当遍历到叶子节点时,将`path`列表拷贝一份并加入`result`列表中。最后返回`result`列表。
`preorder_traversal`函数用于执行先序遍历,接收一个根节点作为参数。函数首先判断根节点是否为`None`,如果是则返回空列表。否则,执行先序遍历并将遍历结果保存到`result`列表中,最后返回`result`列表。
在主程序中,首先读入结点个数`n`和每个结点的编号及度数的列表`nodes`。然后调用`build_tree`函数构建孩子-兄弟链表,再调用`get_leaves_path`函数获取从根节点到每个叶子节点的路径。最后对于每个路径,先输出路径,再输出该路径的先序遍历结果。
阅读全文
相关推荐
![java](https://img-home.csdnimg.cn/images/20250102104920.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)