星星来啦 2023-07-21 17:33 采纳率: 70.6%
浏览 38

一个C++问题,各位能帮我做一下吗

题目描述
给定一棵树,对这棵树进行先序遍历、后序遍历、层次遍历、叶子结点遍历,分别输出对应序列,每个数字也空格隔开。
树的节点编号为1 -n,边数为n-1。

输入
第一行:n(结点数<=100)。 以下n-1行;每行两个结点x和y,表示y是x的“还子”(x,y<=100)。每个结点总是按从左到右的相对次序给出“还子”的信息。
输出
第一行:先序遍历序列 第二行:后序遍历序列 第三行:层次遍历序列 第四行:叶子结点遍历序列
样例
输入 复制
8
4 1
4 2
1 3
1 5
2 6
2 7
2 8
输出 复制
4 1 3 5 2 6 7 8
3 5 1 6 7 8 2 4
4 1 2 3 5 6 7 8
3 5 6 7 8
请问有哪个C++编程的神仙能帮我做一下!谢谢!

  • 写回答

3条回答 默认 最新

  • 头发乱了_257 2023-07-21 18:48
    关注

    使用了队列和栈两种数据结构来完成不同的遍历方式:

    
    from collections import deque
    
    # 定义节点类
    class Node:
        def __init__(self, val):
            self.val = val
            self.left = None
            self.right = None
    
    # 先序遍历
    def preorder(root):
        if root is None:
            return []
        stack, res = [root], []
        while stack:
            node = stack.pop()
            res.append(node.val)
            if node.right is not None:
                stack.append(node.right)
            if node.left is not None:
                stack.append(node.left)
        return res
    
    # 后序遍历
    def postorder(root):
        if root is None:
            return []
        stack1, stack2, res = [root], [], []
        while stack1:
            node = stack1.pop()
            stack2.append(node)
            if node.left is not None:
                stack1.append(node.left)
            if node.right is not None:
                stack1.append(node.right)
        while stack2:
            node = stack2.pop()
            res.append(node.val)
        return res
    
    # 层次遍历
    def levelorder(root):
        if root is None:
            return []
        queue, res = deque([root]), []
        while queue:
            node = queue.popleft()
            res.append(node.val)
            if node.left is not None:
                queue.append(node.left)
            if node.right is not None:
                queue.append(node.right)
        return res
    
    # 叶子节点遍历
    def leaforder(root):
        if root is None:
            return []
        stack, res = [root], []
        while stack:
            node = stack.pop()
            if node.right is not None:
                stack.append(node.right)
            if node.left is not None:
                stack.append(node.left)
            if node.left is None and node.right is None:
                res.append(node.val)
        return res
    
    # 主函数
    if __name__ == '__main__':
        n = int(input())
        nodes = [Node(i) for i in range(n)]
        for _ in range(n - 1):
            x, y = map(int, input().split())
            if nodes[x - 1].left is None:
                nodes[x - 1].left = nodes[y - 1]
            else:
                nodes[x - 1].right = nodes[y - 1]
        print(' '.join(map(str, preorder(nodes[0]))))
        print(' '.join(map(str, postorder(nodes[0]))))
        print(' '.join(map(str, levelorder(nodes[0]))))
        print(' '.join(map(str, leaforder(nodes[0]))))
    
    

    首先读入节点数n和边的关系,然后创建了一个长度为n的节点数组。接着,对于每一条边(x,y),如果x节点还没有左儿子,则把y节点作为x的左儿子,否则作为右儿子。最后调用4个不同的遍历函数,分别输出先序、后序、层次、叶子节点遍历序列

    评论

报告相同问题?

问题事件

  • 修改了问题 7月21日
  • 创建了问题 7月21日

悬赏问题

  • ¥15 部分客户订单定位有误的问题
  • ¥15 如何在maya程序中利用python编写领子和褶裥的模型的方法
  • ¥15 Linux权限管理相关操作(求解答)
  • ¥15 Bug traq 数据包 大概什么价
  • ¥15 在anaconda上pytorch和paddle paddle下载报错
  • ¥25 自动填写QQ腾讯文档收集表
  • ¥15 DbVisualizer Pro 12.0.7 sql commander光标错位 显示位置与实际不符
  • ¥15 android 打包报错
  • ¥15 关于stm32的问题
  • ¥15 ncode振动疲劳分析中,noisefloor如何影响PSD函数?