数据结构之二叉树 树结构练习---判断给定森林中有多少棵树

树结构练习——判断给定森林中有多少棵树

Time Limit: 1000MS Memory limit: 65536K

题目描述

众人皆知,在编程领域中,C++是一门非常重要的语言,不仅仅因为其强大的功能,还 因为它是很多其他面向对象语言的祖先和典范。不过这世上几乎没什么东西是完美的,C++也不例外,多继承结构在带来强大功能的同时也给软件设计和维护带来 了很多困难。为此,在java语言中,只允许单继承结构,并采用接口来模拟多继承。KK最近获得了一份java编写的迷你游戏的源代码,他对这份代码非常 感兴趣。这份java代码是由n个类组成的(本题不考虑接口),现在,他想要知道这份代码中有多少个类没有直接基类。n个类分别用数字1..n表示。

输入

输入数据包含多组,每组数据格式如下。

第一行包含两个整数n,m,表示该份代码中的n个类和m个单继承关系。

后面m行,每行两个整数a b,表示a是b的直接基类。

输出

对于每组输入,输出该组数据中有多少个类没有直接基类。每组输出占一行。

示例输入

2 1
1 2
2 0

示例输出

1
2

提示

/*
将森林转化成二叉树具体方法:
    ① 将森林中的每棵树变为二叉树
  ② 因为转换所得的二叉树的根结点的右子树均为空,故可将
 各二叉树的根结点视为兄弟从左至右连在一起,就形成了一棵二叉树。
*/

//由上面很容易看出但凡是将森林分成树然后讲每棵树转化成二叉树其根节点等于其本身。

#include <string>
#include <iostream>
#include <algorithm>

using namespace std;

int bin[1002];

int find(int x)
{
    int r=x;
    while(bin[r]!=r)
    {
        r=bin[r];
    }
    return r;
}

void merge(int x, int y)
{
    int xx=x;
    int yy=y;
    xx=find(xx);
    yy=find(yy);
    if(xx!=yy)
    {
        bin[xx]=yy;
    }
}

int main()
{
    int n,m;
    int i, j;
    int x, y;
    int cnt;

    while(cin>>n>>m)
    {
        cnt=0;
        for(i=0; i<=n; i++)
        {
            bin[i]=i;
        }
        for(i=0; i<m; i++)
        {
            cin>>x>>y;
            merge(x, y);
        }
        for(i=1; i<=n; i++)
        {
            if(bin[i]==i) //一开始先对每个二叉树的每个节点标号 然后并查集连接成树,                          //最后遍历节点依然等于自己本身的就是一棵独立二叉树
              cnt++;
        }
        cout<<cnt<<endl;
     }
    return 0;
}
时间: 2024-11-05 21:52:20

数据结构之二叉树 树结构练习---判断给定森林中有多少棵树的相关文章

树结构练习——判断给定森林中有多少棵树(简单做法)

树结构练习——判断给定森林中有多少棵树 Time Limit: 1000MS Memory limit: 65536K 题目描述 众人皆知,在编程领域中,C++是一门非常重要的语言,不仅仅因为其强大的功能,还 因为它是很多其他面向对象语言的祖先和典范.不过这世上几乎没什么东西是完美的,C++也不例外,多继承结构在带来强大功能的同时也给软件设计和维护带来 了很多困难.为此,在java语言中,只允许单继承结构,并采用接口来模拟多继承.KK最近获得了一份java编写的迷你游戏的源代码,他对这份代码非常

数据结构之二叉树 树结构练习——排序二叉树的中序遍历 (排序建树+中序遍历)

树结构练习——排序二叉树的中序遍历 Time Limit: 1000MS Memory limit: 65536K 题目描述 在树结构中,有一种特殊的二叉树叫做排序二叉树,直观的理解就是——(1).每个节点中包含有一个关键值 (2).任意一个节点的左子树(如果存在的话)的关键值小于该节点的关键值 (3).任意一个节点的右子树(如果存在的话)的关键值大于该节点的关键值.现给定一组数据,请你对这组数据按给定顺序建立一棵排序二叉树,并输出其中序 遍历的结果. 输入 输入包含多组数据,每组数据格式如下.

数据结构之二叉树 树结构练习---二叉排序树

二叉排序树 Time Limit: 1000MS Memory limit: 65536K 题目描述 二叉排序树的定义是:或者是一棵空树,或者是 具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值: 它的左.右子树也分别为二叉排序树. 今天我们要判断两序列是否为同一二叉排序树 输入 开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束. 接下去一行是一个序列,序列长度小

020给定两个二叉树T1,T2判断T1是否是T2的子树(keep it up)

给定两个二叉树T1,T2判断T1是否是T2的子树 首先在T2中查找T1的根节点,如果找不到, 则T1不是T2的子树,如果能找到,我们可以 遍历T1,检查T1的每个结点是否对应的存在T2 中. 代码: struct TreeNode { int data; TreeNode* leftChild; TreeNode* rightChild; }; bool isExited(const TreeNode* vRoot1, const TreeNode *vRoot2, TreeNode* vRes

数据结构之二叉树总篇(Java)

前言 面试中的树都是二叉树,即有左右两个节点的树 牢记:root.left表示左子树,root.right表示右子树,通过树的递归解决问题 二叉树定义 public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } 求二叉树中节点的个数 递归 /** * 求二叉树中的节点个数递归解法: O(n) * (1

python环境下使用mysql数据及数据结构和二叉树算法(图)

python环境下使用mysql数据及数据结构和二叉树算法(图):1 python环境下使用mysql2使用的是 pymysql库3 开始-->创建connection-->获取cursor-->操作-->关闭cursor->关闭connection->结束45 代码框架6 import pymysql.cursors7 ###连接数据库8 connection = pymysql.connect(host='127.0.0.1',port=3306,user='roo

数据结构之二叉树的构建C++版

二叉树的构建要注意与链式表的区别,二叉树这里的构建十分低级,每个树只是构建了一个单一的二叉树节点,总体来看是有下向上构建的.用户需要手动去构建自己需要的树,而不是直接去插入数据就到二叉树中了,因为不是链式结构的单一,二叉树十分丰富的. 提一下遍历: 迭代的方式遍历十分简单.先序.中序.后序遍历都只是针对根节点.比如中序,就是先遍历左子树-->根节点-->右子树.(根节点在中间) /* 1) 树的基本概念: 度:说白了就是节点拥有的子分支数 叶子节点:说白了就是度为0的节点 双亲:说白了就是父亲

比较两棵二叉树--(比较两棵二叉树是否相同/判断一棵二叉树是否是另一棵二叉树的子树)

一,问题介绍 本文章讨论两个问题: ①如何判断两棵二叉树的结构是一样的.对应的每个结点都有着相同的值.--即判断两棵二叉树是一样的 ②给定两棵二叉树,如何判断一棵二叉树是另一棵二叉树的子结构 ③给定两棵二叉树,如何判断一棵二叉树是另一棵二叉树的子树 注意,子结点与子树有那么一点点不同. 上面的二叉树B 是二叉树A 的子结构,但是不能说是二叉树A的子树.但是二叉树C 是 二叉树A的子树. 二,问题分析 1,如何判断两棵二叉树的结构是一样的.且对应的每个结点都有着相同的值. 对于①如何判断两棵二叉树

【数据结构】 二叉树

二叉树概念 在计算机科学中,二叉树是每个节点最多有两个子树的树结构.通常子树被称作"左子树"(left subtree)和"右子树"(right subtree).二叉树常被用于实现二叉查找树和二叉堆. 二 叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒.二叉树的第i层至多有2^{i-1}个结点:深度为k 的二叉树至多有2^k-1个结点:对任何一棵二叉树T,如果其终端结点数为n_0,度为2的结点数为n_2,则n_0=n_