当前位置: 代码迷 >> 综合 >> (结构数组表示二叉树+堆+二叉排序树)笛卡尔树
  详细解决方案

(结构数组表示二叉树+堆+二叉排序树)笛卡尔树

热度:42   发布时间:2023-11-02 23:51:13.0

笛卡尔树是一种特殊的二叉树,其结点包含两个关键字K1和K2。首先笛卡尔树是关于K1的二叉搜索树,即结点左子树的所有K1值都比该结点的K1值小,右子树则大。其次所有结点的K2关键字满足优先队列(不妨设为最小堆)的顺序要求,即该结点的K2值比其子树中所有结点的K2值小。给定一棵二叉树,请判断该树是否笛卡尔树。

输入格式:

输入首先给出正整数N(1000),为树中结点的个数。随后N行,每行给出一个结点的信息,包括:结点的K1值、K2值、左孩子结点编号、右孩子结点编号。设结点从0~(N-1)顺序编号。若某结点不存在孩子结点,则该位置给出?

输出格式:

输出YES如果该树是一棵笛卡尔树;否则输出NO

输入样例1:

6
8 27 5 1
9 40 -1 -1
10 20 0 3
12 21 -1 4
15 22 -1 -1
5 35 -1 -1

输出样例1:

YES

输入样例2:

6
8 27 5 1
9 40 -1 -1
10 20 0 3
12 11 -1 4
15 22 -1 -1
50 35 -1 -1

输出样例2:

NO

这道题建树方法和树的同构一样。

//结构数组表示二叉树
#include<iostream>
using namespace std;
#define null -1 //表示空typedef struct BiNode{int k1,k2,lchild,rchild;
}BiNode;
BiNode T[1001];
int chick[1001];
int createTree(int n)
{for(int i=0;i<n;i++)chick[i]=0;for(int i=0;i<n;i++){cin>>T[i].k1>>T[i].k2>>T[i].lchild>>T[i].rchild;if(T[i].lchild!=-1)chick[T[i].lchild]=1;if(T[i].rchild!=-1)chick[T[i].rchild]=1;}for(int i=0;i<n;i++){if(chick[i]==0)return i;}return null;
}bool isBST(int r)
{int p;if(r==null)return true;if(T[r].lchild==null&&T[r].rchild==null)return true;p=T[r].lchild;if(p!=null){while(T[p].rchild!=null)p=T[p].rchild;if(T[r].k1<T[p].k1)return false;}p=T[r].rchild;if(p!=null){while(T[p].lchild!=null)p=T[p].lchild;if(T[r].k1>T[p].k1)return false;}return isBST(T[r].lchild)&&isBST(T[r].rchild);
}bool isHeap(int n)
{for(int i=n;i>=0;i--)//这个地方i初值取n/2也算对,我感觉这种情况是测试数据不够严谨,侥幸过的{if(T[i].lchild!=null){if(T[i].k2>T[T[i].lchild].k2)return false;}if(T[i].rchild!=null){if(T[i].k2>T[T[i].rchild].k2)return false;}}return true;
}
int main()
{int n,root;cin>>n;root=createTree(n);if(isBST(root)&&isHeap(n))cout<<"YES"<<endl;elsecout<<"NO"<<endl;return 0;
}





  相关解决方案