首页 > 其他分享 >数据结构学习笔记-先序遍历森林

数据结构学习笔记-先序遍历森林

时间:2024-05-12 18:21:44浏览次数:27  
标签:BiNode 遍历 先序 rChild 数据结构 节点 forest

先序遍历森林

问题描述:设计算法输出先序遍历的森林节点及其所在的层次

【算法设计思想】

1. 数据结构定义

首先,定义二叉树节点的数据结构。每个节点包含存储数据的data字段,以及指向左右子节点的指针(lChildrChild)。这种数据结构是二叉树和森林表示的基础。

2. 先序遍历单棵树

设计一个递归函数preorderTraversal用于先序遍历单棵树。先序遍历的顺序是:先访问根节点,然后递归遍历左子树,最后递归遍历右子树。在访问每个节点时,输出该节点的数据和层次信息。层次信息是通过递归调用时增加的层次参数level来维护的。

3. 遍历森林

森林可以视为二叉树的数组。设计一个函数preorderTraversalForest,它接受表示森林的二叉树数组和数组的大小。对于数组中的每棵树,使用preorderTraversal函数进行先序遍历,并在每棵树的遍历开始前打印一个标识该树的消息,以区分不同的树。

4. 层次信息传递

在遍历过程中,通过递归函数的参数传递当前节点的层次信息。每当递归进入新的一层(即向下遍历到子节点时),层次参数level增加1。这样,可以确保每个节点的层次信息准确无误地被计算和输出。

【算法描述】

void preorderTraversalForest(BiNode** forest, int size) {
    for (int i = 0; i < size; i++) {
        printf("Tree %d:\n", i + 1);
        preorderTraversal(forest[i], 1); // 根节点层次为 1
        printf("\n");
    }
}

【测试程序】

#include <stdio.h>
#include <stdlib.h>

typedef struct BiNode {
    char data;
    struct BiNode* lChild;
    struct BiNode* rChild;
} BiNode, *BiTree;

void preorderTraversal(BiNode* root, int level) {
    if (root == NULL)
        return;
    
    printf("Node: %c, Level: %d\n", root->data, level);
    preorderTraversal(root->lChild, level + 1);
    preorderTraversal(root->rChild, level + 1);
}

void preorderTraversalForest(BiNode** forest, int size) {
    for (int i = 0; i < size; i++) {
        printf("Tree %d:\n", i + 1);
        preorderTraversal(forest[i], 1); // 根节点层次为 1
        printf("\n");
    }
}

BiNode* createNode(char data) {
    BiNode* newNode = (BiNode*)malloc(sizeof(BiNode));
    newNode->data = data;
    newNode->lChild = NULL;
    newNode->rChild = NULL;
    return newNode;
}

int main() {
    // 创建森林,包含两棵树
    BiNode* forest[2];

    // 创建第一棵树
    //      A
    //     / \
    //    B   C
    BiNode* tree1 = createNode('A');
    tree1->lChild = createNode('B');
    tree1->rChild = createNode('C');

    // 创建第二棵树
    //      D
    //       \
    //        E
    BiNode* tree2 = createNode('D');
    tree2->rChild = createNode('E');

    forest[0] = tree1;
    forest[1] = tree2;

    // 遍历森林
    preorderTraversalForest(forest, 2);

    // 释放分配的内存
    free(tree1->lChild);
    free(tree1->rChild);
    free(tree1);
    free(tree2->rChild);
    free(tree2);

    return 0;
}

标签:BiNode,遍历,先序,rChild,数据结构,节点,forest
From: https://www.cnblogs.com/zeta186012/p/18188017

相关文章

  • Object.values()对象遍历
    Object.keys() 对象的遍历 返回给定对象所有可枚举属性的数组;是属性名组成的数组letobj={a:1,b:2,c:3};Object.keys(obj).map((key)=>{console.log(key,obj[key]);}); Object.values() 对象的遍历返回一个给定对象自身的所有属性值的......
  • 目录遍历(Pikachu)
    原理Web安全-目录遍历漏洞_百度搜索文件遍历漏洞-CSDN博客防御1.对用户的输入进行验证,特别是路径替代字符如“../”和“~/”。2.尽可能采用白名单的形式,验证所有的输入。3.合理配置Web服务器的目录权限。4.当程序出错时,不要显示内部相关配置细节。5.对用户传过来的文件名......
  • 数据结构学习笔记-递归求解森林高度
    森林的高度递归求解问题描述:设计算法求解森林的高度【算法设计思想】两个函数,一个用于计算单个二叉树的高度,另一个用于计算二叉树森林(即一组二叉树)的最大高度。下面是对两个函数的详细解释:1.treeHeight函数这个函数用于计算单个二叉树的高度。二叉树的高度定义为从根节点到......
  • TheAlgorithms/C - 各种基础算法、数据结构的 C 语言实现+armink/SFUD - 一款基于 JED
    1、OpenMV-RT-基于恩智浦i.MXRT系列的开源机器视觉AI模块OpenMV-RT是一款基于恩智浦最近主打的i.MXRT超高性能系列MCU的视觉模块,模块设计者是恩智浦大牛工程师宋岩(对,就是ARMCortex-M3权威指南中文版作者)。模块源代码: https://github.com/RockySong/micropython......
  • js 遍历数组取出字符串用逗号拼接
    var arr=[{"name":"hhh"},{"name":"dddd"}] //用jsfunction getTextByJs(){    var str= "";    for (var i=0;i<arr.length;i++){        str+=arr[i].name+ ",";    }    //去掉最后一个逗号(如......
  • 1.1数据结构基本概念
    1.1数据结构基本概念什么是数据?数据是信息的载体,是描述客观事务属性的数、字符及所有能输入到计算机中并被计算机程序识别和处理的符号的集合(二进制0和1)。数据事计算机程序加工的原料。数据元素、数据项数据元素是数据的基本单位,通常作为一个整体进行考虑和处理。一个数据元......
  • 数据结构学习01--栈
    栈栈的特性栈的基本结构我们可以把栈想象成一个装有弹珠的瓶子,先放进去的弹珠在瓶子底部,每次只能将顶部的弹珠倒出。栈的特点由图可以很好的知道后进先出栈的实际应用简单栈栈的概念非常简单,但把这个数据结构运用得当是需要充分理解的。应用1:判断字符串是否合法特殊情......
  • c语言 数据结构,把数据整体循环左(右)移p个位置
    思路:n为数组的长度(利用线性代数的思路)1.左移:把第1到第p个看成集合A,把第p+1到第n个看成集合B,则需要推导AB->BA,过程(A-1)*(B-1)->( (A-1)*(B-1))-1=BA2.右移:把第1到第n-p个看成集合A,把第n-p+1到第n个看成集合B,则需要推导AB->BA,过程(A-1)*(B-1)->( (A-1)*(B-1))-1 =BA 时......
  • 问文心一言——C# 遍历datagridview单元格 不用嵌套循环
    问:C#遍历datagridview单元格不用嵌套循环答:在C#中遍历DataGridView的单元格通常意味着你需要遍历行(Rows)并在每行中遍历单元格(Cells)。然而,如果你想要避免嵌套循环的“感觉”,你可以使用LINQ(LanguageIntegratedQuery)或者一个简单的foreach循环配合委托或Lambda表达式来“扁平化......
  • P3916 图的遍历
    题面:链接:https://www.luogu.com.cn/problem/P3916思路:反向遍历图啊卡了好久,如果正序来的话还得考虑环和先后次序的问题代码:#include<iostream>#include<vector>#include<algorithm>#include<math.h>#include<sstream>#include<string>#include<string.h>......