1、一棵树采用孩子链存储结构/或长子兄弟链存储结构(任选一种),尝试编程实现: (1)创建一棵树 (2)设计一个算法求高度 (3)设计一个算法实现树的层次遍历 设计两个算法实现先根遍历和后根遍历python和代码演示
时间: 2023-06-10 12:03:46 浏览: 121
好的,我会根据您的要求进行回答。下面是您的问题的解答:
1. 一棵树采用孩子链存储结构/或长子兄弟链存储结构(任选一种),尝试编程实现:
我们先来看一下采用孩子链存储结构的树的实现,代码如下:
```
class TreeNode:
def __init__(self, data=None, children=None):
self.data = data
self.children = [] if children is None else children
class Tree:
def __init__(self, root=None):
self.root = root
def create_tree(self, data):
self.root = TreeNode(data)
def add_node(self, parent, data):
node = TreeNode(data)
parent.children.append(node)
def height(self, node):
if not node:
return 0
if not node.children:
return 1
return max(self.height(child)+1 for child in node.children)
def level_order_traversal(self):
if not self.root:
return []
result = []
queue = [self.root]
while queue:
level = []
for _ in range(len(queue)):
node = queue.pop(0)
level.append(node.data)
queue.extend(node.children)
result.append(level)
return result
def preorder_traversal(self, node, result):
if not node:
return
result.append(node.data)
for child in node.children:
self.preorder_traversal(child, result)
def postorder_traversal(self, node, result):
if not node:
return
for child in node.children:
self.postorder_traversal(child, result)
result.append(node.data)
```
这里实现了Tree类和TreeNode类,TreeNode类用于存储节点信息,Tree类则用于实现树操作。create_tree方法用于创建树,add_node用于添加节点。height的实现用于求树的高度,level_order_traversal用于实现层次遍历,preorder_traversal用于先根遍历,postorder_traversal用于后根遍历。
下面我们来看一下代码的使用,以一个具体的例子来说明:
```
# 创建树
tree = Tree()
tree.create_tree(1)
# 添加节点
node1 = tree.root
tree.add_node(node1, 2)
tree.add_node(node1, 3)
node2 = node1.children[0]
tree.add_node(node2, 4)
tree.add_node(node2, 5)
node3 = node1.children[1]
tree.add_node(node3, 6)
# 求高度
print(tree.height(tree.root))
# 层次遍历
print(tree.level_order_traversal())
# 先根遍历
result = []
tree.preorder_traversal(tree.root, result)
print(result)
# 后根遍历
result = []
tree.postorder_traversal(tree.root, result)
print(result)
```
上面的代码创建了一棵如下的树:
```
1
/ \
2 3
/ \
4 5
\
6
```
运行上面的代码会输出以下结果:
```
3
[[1], [2, 3], [4, 5, 6]]
[1, 2, 4, 5, 6, 3]
[4, 6, 5, 2, 3, 1]
```
其中,高度为3,层次遍历输出的结果是[[1], [2, 3], [4, 5, 6]],先根遍历的结果是[1, 2, 4, 5, 6, 3],后根遍历的结果是[4, 6, 5, 2, 3, 1]。
接下来看一下采用长子兄弟链存储结构的树的实现,代码如下:
```
class TreeNode:
def __init__(self, data=None, sibling=None, child=None):
self.data = data
self.sibling = sibling
self.child = child
class Tree:
def __init__(self, root=None):
self.root = root
def create_tree(self, data):
self.root = TreeNode(data)
def add_node(self, parent, data):
node = TreeNode(data)
if not parent.child:
parent.child = node
else:
cur = parent.child
while cur.sibling:
cur = cur.sibling
cur.sibling = node
def height(self, node):
if not node:
return 0
return max(self.height(node.child)+1 if node.child else 1, self.height(node.sibling))
def level_order_traversal(self):
if not self.root:
return []
result = []
queue = [self.root]
while queue:
level = []
for _ in range(len(queue)):
node = queue.pop(0)
level.append(node.data)
if node.child:
queue.append(node.child)
sibling = node.sibling
while sibling:
level.append(sibling.data)
if sibling.child:
queue.append(sibling.child)
sibling = sibling.sibling
result.append(level)
return result
def preorder_traversal(self, node, result):
if not node:
return
result.append(node.data)
if node.child:
self.preorder_traversal(node.child, result)
if node.sibling:
self.preorder_traversal(node.sibling, result)
def postorder_traversal(self, node, result):
if not node:
return
if node.child:
self.postorder_traversal(node.child, result)
result.append(node.data)
if node.sibling:
self.postorder_traversal(node.sibling, result)
```
这里和之前的实现相比,TreeNode类只是将children改为了sibling和child,Tree类的方法也做了相应的修改。不过原理和之前的实现是一样的。
下面我们同样举个例子来看一下代码的使用:
```
# 创建树
tree = Tree()
tree.create_tree(1)
# 添加节点
node1 = tree.root
tree.add_node(node1, 2)
tree.add_node(node1, 3)
node2 = node1.child
tree.add_node(node2, 4)
tree.add_node(node2, 5)
node5 = node2.sibling.sibling
tree.add_node(node5, 6)
# 求高度
print(tree.height(tree.root))
# 层次遍历
print(tree.level_order_traversal())
# 先根遍历
result = []
tree.preorder_traversal(tree.root, result)
print(result)
# 后根遍历
result = []
tree.postorder_traversal(tree.root, result)
print(result)
```
上面的代码创建了一棵和之前相同的树,运行结果和之前也是相同的。
这样,我们就完成了一棵树的孩子链存储结构和长子兄弟链存储结构的实现。
附上的完整代码如下:
阅读全文
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.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)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![docx](https://img-home.csdnimg.cn/images/20241231044901.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![pptx](https://img-home.csdnimg.cn/images/20241231044947.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)