#include
#include
using namespace std;
struct Node{
int lson;
int rson;
int val;
}node[10000<<2];
int N1,N2;
void dfs(int n)
{
N1++;
if (node[n].lson==node[n].rson&&node[n].lson==0)
{
N2++;
return;
}
if (node[n].lson)
dfs(node[n].lson);
if (node[n].rson)
dfs(node[n].rson);
}
这是在你知道头结点的情况下的, 把头节点的值压入dfs函数中就可以得到N1 ,N2 的值(因为开的是全局 初值为0)
如果不知道头节点 数据是随机给出的 那么要使用并查集来找到头节点 ,简单的说
开一个father数组 (下面代码里用fa[] 表示 ) 因为二叉树的性质,每个节点最多有两个儿子,但每个节点除了头节点必定有且只有一个父亲 头节点的父亲就是自己
开始时每个节点的初值都是自己,每次添加一个节点,把两个子节点的父亲修改
下面是代码:
int fa[10000<<4];
void init()
{
for (int i=0;i<(10000<<4);i++)
fa [ i ] = i ;
}
int findfa(int n)
{
if (fa[n]==n)
return n;
else
return findfa(fa[n]);
}
int main()
{
int n,l,r,v;
while (cin>>n>>l>>r>>v)
{
node[n].lson=l;
node[n].rson=r;
node[n].val =n;
fa[l]=n;
fa[r]=n;
}
int head = findfa(1);
//head即为根节点
}