C++ 编写一算法,求出一棵二叉树中所有结点数和叶子结点数,假定分别用变参N1和N2统计所有结点数

2024-11-16 09:21:51
推荐回答(1个)
回答(1):

#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即为根节点
}