7-31 笛卡尔树的判断

这个主要是对二叉树的遍历,并不困难

/*
* data :2020.7.8 
* theme:路径 
*/
#include <iostream>
#include <cstdlib>
using namespace std;
#define N 1005
int judge[N];
int cont = 0;
struct node
{
    
    
    int k1;
    int k2;
    int left;
    int right;
    int parent;
};
struct node *p;
int gethead(int n)
{
    
    
    for (int i = 0; i < n; i++)
    {
    
    
        if (p[i].parent == -1)
        {
    
    
            return i;
        }
    }
}
void judge_k1(int head)
{
    
    
    //先序遍历
    if (head != -1)
    {
    
    
        judge_k1(p[head].left);
        judge[cont++] = p[head].k1;
        judge_k1(p[head].right);
    }
}
int judge_all(int n)
{
    
    
    for (int i = 0; i < n - 1; i++)
    {
    
    
        if (judge[i] > judge[i + 1])
        {
    
    
            return 0;
        }
       
    }
     return 1;
}
int judge_k2(int head)
{
    
    
    //
    if (p[head].left != -1)
    {
    
    
        if (p[p[head].left].k2 <= p[head].k2)
        {
    
    
            return 0;
        }
         if(judge_k2(p[head].left)==0)
         return 0;   
    }
    if (p[head].right != -1)
    {
    
    
        if (p[head].k2 >= p[p[head].right].k2)
        {
    
    
           return 0;
        }
            if(judge_k2(p[head].right)==0){
    
    
                return 0;
            }
    }
    
    return 1;
}

int main()
{
    
    
    int number;
    int head = 0;
    int flag = 0;
    int k1, k2, left, right;
    cin >> number;
    p = new struct node[number + 1];
    for (int i = 0; i < number; i++)
    {
    
    
        p[i].parent = -1;
    }
    for (int i = 0; i < number; i++)
    {
    
    
        cin >> k1 >> k2 >> left >> right;
        //输入信息

        p[i].k1 = k1;
        p[i].k2 = k2;
        p[i].left = left;
        p[i].right = right;
        if (left != -1)
        {
    
    
            p[left].parent = i;
        }
        if (right != -1)
        {
    
    
            p[right].parent = i;
        }
    }
    head = gethead(number);
    judge_k1(head);
    if (judge_all(number) == 1)
    {
    
    
        flag++;
    }
    //判断是不是k1
    if (judge_k2(head) == 1)
    {
    
    
        flag++;
    }
    if (flag == 2)
    {
    
    
        cout << "YES" << endl;
    }
    else
        cout << "NO" << endl;
}

おすすめ

転載: blog.csdn.net/weixin_44724691/article/details/107219617