数据结构4 - 树与图(非线性结构)

一、专业术语:

1. 节点   

2. 父节点  

3. 子节点

4. 子孙   

5. 堂兄弟、亲兄弟

6. 深度:从根节点到最底层节点的层数,为深度。

7. 叶子节点:没有子节点的节点就叫做叶子节点。

8. 非终端节点 == 非叶子节点

9. 度:子节点的个数。

二、树的分类

2.1 一般树

任意一个节点的子节点个数都不受限制。

2.2 二叉树

任意一个节点的子节点最多两个,且子节点树不可更改。

分类:

1. 一般二叉树

2. 满二叉树:在不增加层数的前提下,不能再增加一个节点的树。

3. 完全二叉树:如果只删除了满二叉树的最底层最右边连续的若干个(可以是0个)节点所形成的树。

2.3 森林

n个互不相交的树的集合。

三、树存储

1、二叉树的存储:

    1.1 连续存储[完全二叉树]
        优点:查找某个节点的父节点和子节点(也包括判断有没有子节点)的速度很快。
        缺点:非常耗内存。

    1.2 链式存储
        三个指针域:parent,left,right。

2、一般树存储
    2.1 双亲表示法
    2.2 孩子表示法
    2.3 双亲孩子表示法
    2.4 二叉树表示法:左指针域指向左边的第一个孩子节点,右指针域指向亲兄弟


3、森林存储:也是转换为二叉树存储。
    

四、二叉树的操作

495676-20170503020754320-1192313037.png

练习题

五、二叉树先序遍历程序

//
//  main.c
//  链式二叉树
//
//  Created by zhengbing on 2017/5/3.
//  Copyright © 2017年 zhengbing. All rights reserved.
//

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

struct TNode {
    char data;
    struct TNode * left;
    struct TNode * right;
};

struct TNode * creatNode(void); // 创建树
void preTraverse(struct TNode * pRoot); // 先序遍历

int main(int argc, const char * argv[]) {

    struct TNode * pRoot = creatNode();
    preTraverse(pRoot);
    return 0;
}

void preTraverse(struct TNode * pRoot){

    if (pRoot != NULL) {
        printf("%c \n", pRoot->data);
        preTraverse(pRoot->left);
        preTraverse(pRoot->right);
    }
}

struct TNode * creatNode(void){

    struct TNode *pA = (struct TNode *)malloc(sizeof(struct TNode));
    struct TNode *pB = (struct TNode *)malloc(sizeof(struct TNode));
    struct TNode *pC = (struct TNode *)malloc(sizeof(struct TNode));
    struct TNode *pD = (struct TNode *)malloc(sizeof(struct TNode));
    struct TNode *pE = (struct TNode *)malloc(sizeof(struct TNode));
    struct TNode *pF = (struct TNode *)malloc(sizeof(struct TNode));
    struct TNode *pG = (struct TNode *)malloc(sizeof(struct TNode));

    pA->data = 'A';
    pB->data = 'B';
    pC->data = 'C';
    pD->data = 'D';
    pE->data = 'E';
    pF->data = 'F';
    pG->data = 'G';

    pA->left = pB;
    pA->right = pC;

    pB->left = pD;
    pB->right = pF;

    pC->left = pC->right = NULL;

    pD->left = NULL;
    pD->right = pE;

    pE->left = pE->right = NULL;

    pF->left = pG;
    pF->right = NULL;

    pG->left = pG->right = NULL;

    return pA;
}

转载于:https://www.cnblogs.com/markbin/p/6799970.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值