Duyệt cây trong bài mọi con đường về không


Submit solution

Points: 3 (partial)
Time limit: 3.0s
Memory limit: 977M

Author:
Problem types
Allowed languages
Ada, Assembly, Awk, C, C++, C11, CLANG, CLANGX, Classical, COBOL, Coffee, CSC, D lang, DART, F95, FORTH, Fortrn, GAS32, GO, Haskell, Itercal, Java, kotlin, LEAN, LISP, LUA, MONOVB, Nasm, OCAML, Pascal, Perl, php, PIKE, prolog, Pypy, Python, Ruby 2, RUST, Scala, SCM, SED, SWIFT, TCL, TUR, V8JS, VB, ZIG

Số nguyên dương n nếu phân tích thành tích hai số tự nhiên \(a * b (a<=b)\) thì nó sẽ sinh ra số tự nhiên \(m=(a-1)*(b+1)\) cứ tiếp tục như vậy nếu \(m > 0\) nó tiếp tục sinh ra số tiếp theo. Bài toán đặt ra cho số n nguyên dương nó sẽ sinh ra các con và các con lại tiếp tục sinh ra các cháu ... cứ như vậy tới khi sinh ra tới các số \(0\) thì sẽ tạo thành một cây.

Nam đang học môn Cấu trúc dữ liệu và giải thuật đến bài về Cây và biết rằng có 3 cách duyệt cây: Duyệt cây theo tiền thứ tự, trung thứ tự và hậu thứ tự

  1. Duyệt cây theo tiền thứ tự (Preorder walk): Duyệt gốc trước rồi đến lần lượt các cây con theo tiền thứ tự
  2. Duyệt cây theo trung thứ tự (Inorder walk): Duyệt cây con trái nhất (con trưởng) theo trung thứ tự rồi đến gốc rồi đến các cây con còn lại theo trung thứ tự
  3. Duyệt cây theo hậu thứ tự (Postorder walk): Duyệt lần lượt hết các cây con theo hậu thứ tự rồi đến gốc

Nam băn khoăn là với một số nguyên dương n nhập vào thì nó sẽ sinh ra cái cây thì kết quả duyệt cây như thế nào: Bạn hãy lập trình giúp bạn Nam lớp CNTT2 K58- UTC nhé

Ví dụ \(m= 12\) ta có cây được sinh ra như sau

enter image description here

Input:

Một số tự nhiên n \((1<=n<180)\)

Output:

Gòm 3 dòng lần lượt tương ứng là kết quả duyệt cây theo tiền thứ tự, trung thứ tự và hậu thứ tự

Ví dụ

Input

12

Output

12 0 7 0 10 0 6 0 4 0 3 0 
0 12 0 7 0 10 0 6 0 4 0 3 
0 0 7 0 0 0 0 3 4 6 10 12

Ví dụ 2

Input

18

Output

18 0 10 0 6 0 4 0 3 0 14 0 8 0 5 0 
0 18 0 10 0 6 0 4 0 3 0 14 0 8 0 5 
0 0 0 0 0 3 4 6 10 0 0 0 5 8 14 18
tichpx

Comments


  • 0
    kienduy1221  commented on Oct. 31, 2024, 2:08 p.m.
    #include<bits/stdc++.h>
    #include <iostream>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    
    struct Node {
        int data; // Giá tr? c?a nút
        vector<Node*> children; // Danh sách các con c?a nút
    
        Node(int val) : data(val) {}
    };
    
    class GeneralTree {
    private:
        Node* root; // G?c c?a cây
    
    public:
        // Kh?i t?o cây v?i g?c có giá tr? `rootData`
        GeneralTree(int rootData) {
            root = new Node(rootData);
        }
    
        // Hàm thêm con cho m?t nút
        Node* insert(Node* parent, int childData) {
            Node* child = new Node(childData);
            parent->children.push_back(child);
            return child; // Tr? v? nút con v?a thêm
        }
    
        // Hàm truy c?p g?c c?a cây
        Node* getRoot() {
            return root;
        }
    
        // Hàm t?o cây theo công th?c `(a - 1) * (x / a + 1)`
        void buildTree(Node* parent) {
            if (parent->data > 0) {
                int x = parent->data;
                for (int a = 1; a * a <= x; a++) {
                    if (x % a == 0) {
                        int y = (a - 1) * (x / a + 1);
                        if (y >= 0) { // N?u y >= 0 th? thêm vào cây
                            Node* child = insert(parent, y);
                            buildTree(child); // Đ? quy đ? xây d?ng cây cho con
                        }
                    }
                }
            }
        }
    
        // Hàm duy?t cây theo ki?u ti?n th? t? (preOrder)
        void preOrder(Node* node, void (*visit)(Node*)) {
            if (node == nullptr) return;
            visit(node); // Th?c hi?n hành đ?ng trên nút
            for (Node* child : node->children) {
                preOrder(child, visit); // Duy?t qua các con
            }
        }
    
        void inOrder(Node* node, void (*visit)(Node*)) {
        if (node == nullptr) return;
    
        // Duy?t in-order con đ?u tiên (n?u có)
        if (!node->children.empty()) {
            inOrder(node->children[0], visit);
        }
    
        // Th?c hi?n thao tác trên nút hi?n t?i
        visit(node);
    
        // Duy?t in-order các con c?n l?i (n?u có)
        for (size_t i = 1; i < node->children.size(); i++) {
            inOrder(node->children[i], visit);
        }
    }
    
    
    
        // Hàm duy?t cây theo ki?u h?u th? t? (postOrder)
        void postOrder(Node* node, void (*visit)(Node*)) {
            if (node == nullptr) return;
            for (Node* child : node->children) {
                postOrder(child, visit); // Duy?t qua các con
            }
            visit(node); // Th?c hi?n hành đ?ng trên nút
        }
    };
    
    // Hàm in giá tr? c?a m?t nút
    void printNode(Node* node) {
        cout << node->data << " ";
    }
    
    int main() {
        int n;
    //    cout << "Nhap gia tri n: ";
        cin >> n;
    
        // T?o cây v?i nút g?c là `n`
        GeneralTree tree(n);
    
        // Xây d?ng cây b?t đ?u t? g?c
        tree.buildTree(tree.getRoot());
    
        // Duy?t cây theo các ki?u duy?t
    //    cout << "Duyet Preorder: ";
        tree.preOrder(tree.getRoot(), printNode);
        cout << endl;
    
    //    cout << "Duyet Inorder: ";
        tree.inOrder(tree.getRoot(), printNode);
        cout << endl;
    
    //    cout << "Duyet Postorder: ";
        tree.postOrder(tree.getRoot(), printNode);
        cout << endl;
    
        return 0;
    }