【PAT甲级 堆的判断/树的遍历 C++】1155 Heap Paths (30 分)

DFS 1

# include <bits/stdc++.h>
using namespace std;

vector<int> T;
int N;
vector<int> path;

void DFS(int root) {
    
    
    if(root > N) return;
    if(root * 2 > N) {
    
     // 递归边界------叶子结点
        path.push_back(root);
        for(int i = 0;i < path.size();++i)
            cout << T[path[i]] << (i == path.size()-1 ?"\n":" ");
        // cout << T[root] << endl; // 到叶子结点的时候可以不push或pop,可以直接输出叶子结点,格式输出也方便很多。
        path.pop_back(); // 要记得pop
        
        return;
    }
    
    path.push_back(root);
    DFS(root * 2 + 1); // 往右子树递归
    path.pop_back();

    path.push_back(root);
    DFS(root * 2);     // 往左子树递归
    path.pop_back();
}

int main(){
    
    
    cin >> N;
    T.resize(N + 1);
    for(int i = 1;i <= N;++i)
        cin >> T[i];
    
    bool isMaxHeap = is_heap(T.begin()+1, T.end());
    bool isMinHeap = is_heap(T.begin()+1, T.end(), greater<int>());
    
    // path.push_back(1);
    DFS(1);
    if(isMaxHeap) {
    
    
        cout << "Max Heap\n";
    } else 
    if(isMinHeap) {
    
    
        cout << "Min Heap\n";
    } else
    if(!isMaxHeap && !isMinHeap) {
    
    
        cout << "Not Heap\n";
    }
    
    return 0;
}

DFS 2

# include <bits/stdc++.h>
using namespace std;

vector<int> T;
int N;
vector<int> path;

void DFS(int root) {
    
    
    if(root > N) return;
    if(root * 2 > N) {
    
    
        for(int i = 0;i < path.size();++i)
            cout << T[path[i]] << (i == path.size()-1 ?"\n":" ");
        return;
    }

    path.push_back(root * 2 + 1);
    DFS(root * 2 + 1); // 往右子树递归
    path.pop_back();

    path.push_back(root * 2);
    DFS(root * 2);     // 往左子树递归
    path.pop_back();
}

int main(){
    
    
    cin >> N;
    T.resize(N + 1);
    for(int i = 1;i <= N;++i)
        cin >> T[i];
    
    bool isMaxHeap = is_heap(T.begin()+1, T.end());
    bool isMinHeap = is_heap(T.begin()+1, T.end(), greater<int>());
    
    path.push_back(1);
    DFS(1);
    if(isMaxHeap) {
    
    
        cout << "Max Heap\n";
    } else 
    if(isMinHeap) {
    
    
        cout << "Min Heap\n";
    } else
    if(!isMaxHeap && !isMinHeap) {
    
    
        cout << "Not Heap\n";
    }
    
    return 0;
}

猜你喜欢

转载自blog.csdn.net/MYMarcoreus/article/details/114276394