981: 统计利用二叉树存储的森林中树的棵数

devtools/2024/11/15 6:18:50/

解法:

数据结构中,森林(Forest)是一组互不相交的树的集合,而二叉树(Binary Tree)是每个节点最多只有两个子节点的树。下面介绍如何在森林和二叉树之间进行转换。

  1. 森林转换为二叉树:

    • 将森林中的每棵树都转换为二叉树。
    • 对于每棵树,可以选择任意一个节点作为根节点,然后按照先序遍历的方式为树中节点建立左子树和右子树的关系。
    • 将每棵树转换为二叉树后,如果有多棵二叉树,可以使用左子树的最右节点与下一棵二叉树的根节点建立线索(Threaded)关系,以链接多棵二叉树。
  2. 二叉树转换为森林:

    • 对于给定的二叉树,可以通过遍历二叉树的方式将其转换为森林。
    • 可以使用先序遍历的方式遍历二叉树的节点。
    • 对于每个节点,如果有左子树,则将其作为一棵独立的树添加到森林中。
    • 继续遍历右子树,重复上述步骤,直到遍历完整个二叉树。

需要注意的是,森林和二叉树之间的转换是一种概念上的转换,实际上不需要改变底层数据结构。转换只是为了更方便地理解和处理问题而进行的,并不会改变数据的本质。

以森林转化为二叉树举例:

暂时还不会,挖个坑后面补

1.1每棵树转换为二叉树

将普通树转换为二叉树可以使用多种方法,其中一种常用的方法是使用左孩子右兄弟表示法。具体步骤如下:

  1. 将普通树的根节点作为二叉树的根节点。
  2. 对于普通树中的每个节点,将它的第一个子节点作为二叉树中该节点的左孩子。
  3. 对于普通树中的每个节点的兄弟节点,将其作为二叉树中该节点的右兄弟(即作为左孩子节点的右孩子)。
  4. 重复步骤2和步骤3,直到将所有的节点都转换为二叉树节点。

红色的就是左孩子,对应二叉树左孩子节点(一个)

蓝色的都是兄弟,对应二叉树右孩子节点(兄嘚的关系是右的右)


求棵数很简单。由定义,根节点及其左子树为第一棵树,之后有一个右节点就算一棵

例:A#B#CD###

#include<iostream>
#include<queue>
using namespace std;
int cnt = 1;
struct treeNode {char val;treeNode* left;treeNode* right;treeNode(char x) :val(x), left(nullptr), right(nullptr) {};
};
treeNode* buildTree() {char c;cin >> c;if (c == '#') return nullptr;treeNode* root = new treeNode(c);root->left = buildTree();root->right = buildTree();return root;
}
void dfs(treeNode* root) {if (root == NULL) return;dfs(root->left);if (root->right) {cnt += 1;}dfs(root->right);return;
}
int main() {treeNode* root = buildTree();if (root == NULL) cnt = 0;else {dfs(root);cout << cnt;}return 0;
}


http://www.ppmy.cn/devtools/12561.html

相关文章

富格林:深究受害原因安全规避

富格林指出&#xff0c;现货黄金作为一种广受好评的投资项目&#xff0c;虽说风险比较低&#xff0c;但终究还是会因为不明受害情况而无法安全规避。所以在进行现货黄金中一定要注意深究错误受害交易操作&#xff0c;尽量安全避开这些操作误区。接下来&#xff0c;与富格林一起…

关于Java的三个小题目(很容易错!)

第一题 char运算后的数据类型 最后输出的是什么类型&#xff1f; 答案&#xff1a;int char与byte的联系和区别 char是无符号型的&#xff0c;能够表示一个整数&#xff0c;不能表示负数&#xff08;0~65535&#xff09;&#xff1b;而byte是有符号型的&#xff0c;能够表示…

windows/linux 安装php的 sql server 扩展

Windowsphpstudyphp7.1 下载&#xff1a;ODBC、下载php 的sql server 扩展 路径&#xff1a;下载地址 版本&#xff1a;我的是7.1 对应的ODBC 是13&#xff0c;php 的sql server 扩展为4.3 安装&#xff1a;msodbcsql 直接安装、sqlsrv43 安装完把 扩展复制到php71 的扩展文…

go 这样做就是python

代码 package mainimport "fmt"func main() {var list []interface{}list append(list, 1, 2, 3)list append(list, "d", "d", 3.0)fmt.Println(list, "这是一个万能类型列表,这就是python")dict : map[interface{}]interface{}{&q…

区块链钱包开发——专业区块链开发

随着区块链技术的发展&#xff0c;钱包开发成为了一项至关重要的任务。本文将探讨区块链钱包开发的重要性&#xff0c;分析当前面临的挑战&#xff0c;并展望未来的发展趋势。 一、区块链钱包概述 区块链钱包是一种用于存储和管理数字货币的软件工具。它为用户提供了一个安全的…

Java | Leetcode Java题解之第45题跳跃游戏II

题目&#xff1a; 题解&#xff1a; class Solution {public int jump(int[] nums) {int length nums.length;int end 0;int maxPosition 0; int steps 0;for (int i 0; i < length - 1; i) {maxPosition Math.max(maxPosition, i nums[i]); if (i end) {end maxP…

华硕电脑怎么恢复删除的文件?有5种可以选择的方案

在日常使用华硕电脑的过程中&#xff0c;我们难免会遇到误删重要文件的情况。无论是因为不小心按错了键&#xff0c;还是由于某种软件故障&#xff0c;失去这些文件都可能会给我们带来不小的麻烦。那么&#xff0c;面对这样的情况&#xff0c;我们该如何有效地恢复这些被删除的…

javaweb学习(day13-数据交换和异步请求)

一、JSON 1.介绍 1.1 在线文档 JSon 在线文档&#xff1a;https://www.w3school.com.cn/js/js_json_intro.aspAjax 在线文档&#xff1a;https://www.w3school.com.cn/js/js_ajax_intro.asp 1.2 JSON 介绍 JSON 指的是 JavaScript 对象表示法&#xff08;JavaScript Objec…