Tree | 一般树 —— 概念、建立与凹进输出

20 篇文章 10 订阅
订阅专栏

目录

 

一、树的基本概念

1、树的结构:

2、树一些名词解释:

二、一般树的实现

1、树的结构

2、树的建立

3、树的输出

打印某个节点的函数如下:

整个树的打印递归实现:

End


一、树的基本概念

树是一种数据结构,由n(n>=0)个有限结点组成一个有层次关系的集合

由于形状像一颗倒立的树而得名。

 

当n=0时称为空树,非空树的特征如下:

(1)有且仅有一个根结点R(root)

(2)n > 1时,其余结点可分为m( m > 0 )个互不相交的有限集合,其中每个集合本身又是一棵树,称为原树的子树(Subtree)。

1、树的结构:

可以递归地理解一棵树:

树由一个根节点生成,其下均为它的子树。子树也是其本身为加上其子树生成...

从上往下看,一条边上连接了两个节点,上面的为前驱节点,下面的为后继节点。我们称前驱节点为后继节点的父亲节点,后继节点为前驱节点的孩子节点

2、树一些名词解释:

术语解释
根节点(Root)一棵树最顶端的节点
叶子节点(leaf)没有孩子节点
边(Edge)两个节点之间的连接
路径(Path)连接某一节点到另一节点边的序列
节点高度(Height)从该节点到叶子节点的最长路径的边数
节点层级(Level)从该一结点到根节点路径的边数+1
节点深度(Depth)从根节点到该节点路径的边数
节点的度(Degree)该节点孩子节点的个数

图解:

Edge、Root、Leaf

这里写图片描述

Path

这里写图片描述

Height

这里写图片描述

需要注意的是叶子节点的高度为0树的高度就是根节点的高度

Depth

这里写图片描述

需要注意的是根节点的深度为0

Level

二、一般树的实现

1、树的结构

树的种类有很多,对于一般的树是通过儿子兄弟法构造的。

那么这种表示方法下,树节点的结构应该是这样的:

每个节点有三个域 —— 数据域,左儿子指针域,右兄弟指针

树的整体结构图如下图所示:

左边为树的宏观结构,右边是具体的数据储存方式。

对应的代码实现:

树的节点定义 ——

typedef struct TreeNode {
    int data;
    struct TreeNode * FirstChild;
    struct TreeNode * NextSibling;
} *TREE, tree;

2、树的建立

输入一棵树的层序结构,如:

可以想象,我们的树应该是长这样:

可以通过利用队列实现对一般树的建立。

我们同时需要在树节点的结构中添加一个新的域:记录节点深度depth

话不多说,直接上代码。配合注释+自己画画图理解一下,应该很好看懂:

/* 传入参数为:
 * 层序输入的字符串
 * 根节点T(实际上没有存数据,深度已设为零) */
TREE BuildTree (char s[], TREE root) {
    queue <TREE> Q;
    stack <TREE> S;

    S.push(root);
    int depth = 0;  //用于更新当前遍历到的深度

    /* 将字母改成树的节点
     * 并依次将每个节点入队 */
    for(int i = 0; s[i] != '\0'; i++) {
        switch (s[i]) {
            case ',':
                break;
            case '(':
                depth++;
                break;
            case ')':
                depth--;
                break;
            default:   //只有可能为节点字母了
                TREE temp = (TREE)malloc(sizeof(tree));  //申请一个节点
                temp->c = s[i];
                temp->depth = depth;  //记录节点的深度
                temp->FirstChild = temp->NextSibling =NULL;
                Q.push(temp);  //节点入队
        }
    }
    /* 利用栈建树 
     * 注意:最开始栈内已经加入一个元素root,其深度为0
     * 其他节点已经在队列中,深度 >= 1 */
    while(!Q.empty()) {
        //依次将队头节点与栈顶结点比较:
        if(Q.front()->depth > S.top()->depth) {
            S.top()->FirstChild = Q.front();  //队头挂在栈顶的左儿子
            S.push(Q.front());  //队头入栈
            Q.pop();  //出队
        }
        else if(Q.front()->depth == S.top()->depth) {
            S.top()->NextSibling = Q.front();  //队头挂在栈顶的右兄弟
            S.push(Q.front());  //队头入栈
            Q.pop();  //出队
        }
        else {
            //出栈,一直到栈顶节点深度不小于队头节点
            while (Q.front()->depth < S.top()->depth) {
                S.pop();
            }
        }
    }
    return root;  
    /* root是传入的参数
     * 通过此函数 已经将待建立的树
     * 完整地挂在了root的左儿子上 */
}

3、树的输出

通过以上输入建立好树后,要求输出树的凹进结构,如图,左边绿色部分为输入,黑色部分为输出:

可以看到,这样打印一棵树是可以递归地完成的:

对于一棵树,先打印根节点,再依次打印各个儿子(子树),子树也是这样操作。

比如说这棵树,先打印根节点A,再完成了儿子B的打印,再完成了儿子C的打印,最后完成了儿子D的打印。

 

那么输出时,每个节点占一行,且要根据其深度加上凹进。

打印某个节点的函数如下:

/* 传入树的某个节点 */
void printLine(TREE T) {
    for (int i = 0; i < T->depth - 1; i++) {
        printf("    ");  //多一层则多四个空格凹进
    }
    printf("%c\n", T->c);
}

整个树的打印递归实现:

/* 传入树的根节点 */
void printTree(TREE root) {
    
    //递归的终点,空树不打印
    if (!root) {
        return;
    }
    
    //打印根节点
    printLine(root);
    
    /* 依次打印每个子树 */
    TREE p = root->FirstChild;
    while(p) {
        printTree(p);
        p = p->NextSibling;
    }
}

 

完整代码如下:

#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <queue>
#include <stack>

#define MAX 200

using namespace std;

typedef struct TreeNode {
    char c;
    int depth;
    struct TreeNode * FirstChild;
    struct TreeNode * NextSibling;
} *TREE, tree;


/* 传入参数为:
 * 层序输入的字符串
 * 根节点T(实际上没有存数据,深度已设为零) */
TREE BuildTree (char s[], TREE root) {
    queue <TREE> Q;
    stack <TREE> S;

    S.push(root);
    int depth = 0;  //用于更新当前遍历到的深度

    /* 将字母改成树的节点
     * 并依次将每个节点入队 */
    for(int i = 0; s[i] != '\0'; i++) {
        switch (s[i]) {
            case ',':
                break;
            case '(':
                depth++;
                break;
            case ')':
                depth--;
                break;
            default:   //只有可能为节点字母了
                TREE temp = (TREE)malloc(sizeof(tree));  //申请一个节点
                temp->c = s[i];
                temp->depth = depth;  //记录节点的深度
                temp->FirstChild = temp->NextSibling =NULL;
                Q.push(temp);  //节点入队
        }
    }
    /* 利用栈建树
     * 注意:最开始栈内已经加入一个元素root,其深度为0
     * 其他节点已经在队列中,深度 >= 1 */
    while(!Q.empty()) {
        //依次将队头节点与栈顶结点比较:
        if(Q.front()->depth > S.top()->depth) {
            S.top()->FirstChild = Q.front();  //队头挂在栈顶的左儿子
            S.push(Q.front());  //队头入栈
            Q.pop();  //出队
        }
        else if(Q.front()->depth == S.top()->depth) {
            S.top()->NextSibling = Q.front();  //队头挂在栈顶的右兄弟
            S.push(Q.front());  //队头入栈
            Q.pop();  //出队
        }
        else {
            //出栈,一直到栈顶节点深度不小于队头节点
            while (Q.front()->depth < S.top()->depth) {
                S.pop();
            }
        }
    }
    return root;
    /* root是传入的参数
     * 通过此函数 已经将待建立的树
     * 完整地挂在了root的左儿子上 */
}

/* 传入树的某个节点 */
void printLine(TREE T) {
    for (int i = 0; i < T->depth - 1; i++) {
        printf("    ");  //多一层则多四个空格凹进
    }
    printf("%c\n", T->c);
}

/* 传入树的根节点 */
void printTree(TREE root) {

    //递归的终点,空树不打印
    if (!root) {
        return;
    }

    //打印根节点
    printLine(root);

    /* 依次打印每个子树 */
    TREE p = root->FirstChild;
    while(p) {
        printTree(p);
        p = p->NextSibling;
    }
}

int main () {
    char s[MAX];
    gets(s);

    TREE T = (TREE) malloc(sizeof(tree));
    T->depth = 0;
    T->FirstChild = T->NextSibling = NULL;

    //建树
    TREE root = BuildTree(s, T)->FirstChild;
    //输出树
    printTree(root);
    return 0;
}


End

欢迎关注个人公众号“鸡翅编程”,这里是认真且乖巧的码农一枚,旨在用心写好每一篇文章,平常会把笔记汇总成推送更新~

 

机器学习——决策(一)
Python,数据分析,机器学习,深度学习
07-31 2921
目录 一、概述 1.组成 2.基本流程 二、划分选择 1.信息增益 2.增益率 3.基尼指数 三、剪枝处理 1.预剪枝 2.后剪枝 四、特殊值处理 1.连续值处理 2.缺失值处理 一、概述 决策(Decision Tree)是在已知各种情况发生概率的基础上,通过构成决策来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性的决策分析方法,是直观运用概率分析的一种图解法。由于这种决策分支画成图形很像一棵的枝干,故称决策。在机器学习中,决策是一个预测模型,他
《机器学习by周志华》学习笔记-决策-01决策流程与划分规则
最新发布
vanilla698的博客
05-10 914
本书中的「决策」有时指学习方法,有时指学得的
建立与基本操作
12-08
程序的输入是一个表示结构的广义表。假设的根为 root ,其子森林 F = ( T1 , T2 , … , Tn ),设与该对应的广义表为 L ,则 L =(原子,子表 1 ,子表 2 , … ,子表 n ),其中原子对应 root ,子表 i ( 1<i<=n )对应 Ti 。广义表 (a,(b,(c),(d)),(f,(g),(h ),(i))) 在输出的层次结构时,先输出根结点,然后依次输出各个子,每个子向里缩进 4 个空格,如:针对上图表示的输出的内容应为: a b c d f g h i Degree of tree: 3 Number of nodes of degree 0: 5 Number of nodes of degree 1: 0 Number of nodes of degree 2: 2 Number of nodes of degree 3: 1
一般性结构
qq_37428721的博客
12-22 458
一.一般结点和的ADT template class GTNode{ private: E value; GTNode* parent; GTNode* leftmostChild; GTNode* rightSibling; public: GTNode() { parent = leftmostChild = rightSibling = NULL; } GTNode(E
数据结构:一般
AngryChar的博客
07-31 375
这是我学了这么多天感觉最难的,用了两个链表进行嵌套。 思路:先用一个链表保存所有结点,由于不知道每个有多少子节点,就再用一个链表保存子节点的位置。 数据结构的课是上完了,但是肯定还是不够的,以后我还会在整理。但是近期就难说,逼近我还有下面的课程。 头文件#ifndef __TREE_H__ #define __TREE_H__ #include"error.h" struct
总结的各种建立过程(1)
qq_50438796的博客
03-23 2277
总结建立的各种方法(1)
C语言之一般
疾风剑豪
04-18 346
1、一般 将这种一般的转化成我们熟悉的单链表形式,这有三层,每一层都可以看成单链表或者多个分散的单链表 数据节点如下: struct tree { int elem; struct tree *FirstChild; struct tree *NextBro; }; 每个节点和第一个孩子还有下一个兄弟链接 #include &...
决策——从理论到入手
weixin_51961968的博客
11-14 1071
决策,从基本知识点到入手代码
[机器学习]决策选西瓜
weixin_47593895的博客
12-28 3316
文章目录一、决策1、画法2、决策的剪枝3、挑西瓜决策3.1利用信息增益选择最优划分属性二、sk-learn库对西瓜数据集,分别进行ID3、C4.5和CART的算法代码实现1.ID3算法2、C4.5算法3、CART算法三、参考 一、决策 在机器学习中,决策是一个预测模型,他代表的是对象属性与对象值之间的一种映射关系。Entropy = 系统的凌乱程度,使用算法ID3, C4.5和C5.0生成算法使用熵。这一度量是基于信息学理论中熵的概念。 1、画法 机器学习中,决策是一个预测模型;他代表的是对
决策:挑出好西瓜
weixin_46129506的博客
10-30 3038
目录一、概念二、ID3决策算法1.信息熵2.信息增益3. 增益率(gain ratio)4. 基尼指数(Gini index)5.python编码实现参考资料 一、概念 决策在机器学习中也是比较常见的一种算法,属于监督学习中的一种。看字面意思应该也比较容易理解,相比其他算法比如支持向量机(SVM)或神经网络,似乎决策感觉“亲切”许多。 优点:计算复杂度不高,输出结果易于理解,对中间值的缺失值不敏感,可以处理不相关特征数据。 缺点:可能会产生过度匹配的问题。 使用数据类型:数值型和标称型。 最经典的
表达式解析之表达式建立
11-21
在上一阶段对字元提取的基础上,完成了表达式的构建,通过这一表达式建立,可以很容易生成可顺序执行的基于堆栈的代码,这在脚本解析系统,已经编译器中是一个重要的部分。
建立
weixin_30302609的博客
04-26 598
1代码 ··· BTree CreateBTree(string str,int i){ int len; BTree bt; bt=new TNode; len=str.size(); if(i>len-1 || i<=0) return NULL; if(str[i] == '#') return NULL; bt->data = str[i]; bt->lchild ...
|归纳&总结
legendaryhaha的博客
06-01 524
|归纳&总结普通二叉 普通二叉 平衡二叉 完全二叉 二叉搜索 多叉搜索 红黑 自平衡二叉搜索(AVL) 前缀 线段
建立(二叉
马鸿飞的博客
07-29 255
You are to determine the value of the leaf node in a given binary tree that is the terminal node of a path of least value from the root of the binary tree to any leaf. The value of a path is the sum of values of nodes along that path. input The input fil
建立(已知前序、中序、后序构建二叉
weixin_42272869的博客
04-23 1077
建立 前提的知识: 前序 : 先访问根节点,再访问左子,最后访问右子 中序 : 先访问左子,先访问根节点,最后访问右子 后序 : 先访问左子,再访问右子,最后访问根节点 关于的遍历可以查看这篇博文: 的遍历 根据的这几种遍历结果可以构造唯一的二叉 前序与中序遍历结果构造唯一的二叉 中序与后续遍历结果构造唯一的二叉 前序与后序遍历结果构造的二叉并不唯一 1、给定前序和中序,构造二叉 主要采用递归的思想结合前序与中序的遍历规则: 根节点肯定是前序的节点 根节点确定后,那
数据库浅谈之常见结构
优质后端技术知识记录
02-19 921
数据库 常见结构
数据结构学习—“一般”的基本概念和知识
JoliceYu的技术博客
06-20 2542
最近在中国大学MOOC上选修了浙大的《数据结构》这门课,这周温习了下之前学的一些涉及到“”的基本知识。下面就“一般的”这种抽象数据类型的存储进行总结。 一、“”提出的背景和意义: 1.的意义:与之前的数据结构相比,这种数据结构的提出意义在于:分层次组织数据,这样在数据的管理上会更有效率,主要在于数据的查找。 2.数据查找的定义:根据某个关键字K从数据集合中找出与关键字K相同的记录。
的创建
aiqiang1104的博客
04-27 604
本课题要求递归法创建一棵,并完成前,中,后续遍历。 选择用递归的方法,可以很容易做到前中后续的遍历 创建一个的结构体,有内容data,与左孩子和右孩子指针 typedef struct node{ char data; struct node *lchild; struct node *rchild; }BTnode; 创建的函数,如果遇到#则代...
ASP.NET DataGridTree实现下拉详解与C#源码
1. **数据准备与输出**: - 在服务器端,你需要创建一个能够处理数据结构的C#类,根据实际业务逻辑填充数据,并使用JSON.NET等库将其转换为JSON格式。这样,每次用户选择或展开节点时,只会发送少量的JSON数据,提高...
写文章

热门文章

  • 输入偶数,分解为两素数之和 9840
  • Error | ‘gets’ was not declared in this scope gets(s)之解决办法 7696
  • 【纯干货】清晰易懂!数据结构学霸笔记!此文实在!(收藏!备忘!复习!) 6919
  • 10进制数转换为16位二进制数 6549
  • 运动员最佳匹配问题 | 回溯:N排列(最大剪枝) 6262

分类专栏

  • CODE 2篇
  • --------- 基 础 篇 ---------
  • ★ C语言入门-乐学题解 16篇
  • ★ C++ 2篇
  • ★ Java
  • ① JavaSE 5篇
  • ② JavaSwing 5篇
  • ★ Kotlin 11篇
  • ★ ERROR 1篇
  • --------- 算 法 篇 ---------
  • ★ 数据结构 20篇
  • ★ 算法
  • ① 简单的基本算法 6篇
  • ② 排序算法 4篇
  • ③ 递归与分治算法 7篇
  • ④ 动态规划 12篇
  • ⑤贪心算法 3篇
  • ⑥回溯算法 7篇
  • ⑦分支界限 2篇
  • ⑧网络流 2篇
  • ★ PAT算法题 2篇
  • ① 简单模拟 14篇
  • ② 查找 7篇
  • ③ 图形输出 3篇
  • ④ 日期处理 5篇
  • ⑤ 进制转换 5篇
  • ⑥字符串处理 15篇
  • ⑦ 排序 5篇
  • LeetCode算法题
  • 分治算法 2篇
  • 动态规划算法 1篇
  • --------- 技 术 篇 ---------
  • ★ JavaWeb
  • ① Servlet & Jsp 2篇
  • ★ Android开发
  • ① Android 学习笔记 7篇
  • ② 问题碎碎念 2篇
  • ★ ModelSim
  • verilog 4篇
  • ModelSim使用 1篇

最新评论

  • 解谜游戏 | 感受算法的魅力

    zzh15229994417: 思路清晰,非常感谢学长的分享!

  • Stack | 栈实现 —— 后缀表达式

    LyingOnTheSofa: nb!找了好多,就这个讲的又好又细,关注了!表情包

  • 输入偶数,分解为两素数之和

    我怎么这么菜hh: 为什么输入8会有4+4,而4不是素数呀

  • 运动员最佳匹配问题 | 回溯:N排列(最大剪枝)

    JNU freshman: 可能我学的少,个人觉得有点疑惑:男女的混合优势不是相乘?你怎么只算男的,女的呢?

  • 区间DP | 1:矩阵链乘问题(含优化) —— 例题:矩阵链乘、合并石子

    小徐真的不会: 好像矩阵链乘不满足单调性啊

大家在看

  • 基于SpringBoot+微信小程序的农产品销售平台 596
  • 黑客入门教程(非常详细)从零基础入门到精通,看完这一篇就够了
  • 一切皆是映射:探讨DQN中的注意力机制与记忆增强
  • java计算机毕业设计数据库课程资源平台(开题+程序+论文) 244
  • 入门网络安全工程师要学习哪些内容 535

最新文章

  • 填坑Ⅱ | 简单的数据结构
  • 填坑Ⅰ | 简单的数据结构
  • 水晶球 | 贪心、排序
2020年182篇
2019年3篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家泉州玻璃钢雕塑制作工厂沈阳商业街玻璃钢雕塑施工方案金华小区玻璃钢雕塑安装南平玻璃钢仿真水果雕塑厂家和田地区玻璃钢雕塑人物甘肃frp玻璃钢雕塑商场美陈鲜花的作用厦门楼盘玻璃钢卡通雕塑台州玻璃钢广场雕塑厂家河源玻璃钢动物雕塑包括哪些西藏玻璃钢艺术雕塑猴兔子雕塑玻璃钢玻璃钢雕塑工艺品定制解放玻璃钢雕塑费用新郑市商场美陈特装美陈玻璃钢雕塑费用思明园林玻璃钢雕塑采购上海定制玻璃钢雕塑性价比出众肇庆商场美陈雕塑厂家广东公园小品玻璃钢雕塑工厂中国香港玻璃钢雕塑大全青花瓷玻璃钢花盆图片南京玻璃钢雕塑厂家哪家好烤漆玻璃钢雕塑重庆大型玻璃钢雕塑生产厂家海南玻璃钢雕塑咨询甘肃仿真玻璃钢雕塑制作河池商场美陈雕塑厂家钦州玻璃钢雕塑公司玻璃钢花盆电话多少香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化