数据结构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、森林存储:也是转换为二叉树存储。

四、二叉树的操作

练习题

五、二叉树先序遍历程序

//
//  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;
}


posted @ 2017-05-03 02:08  磨刀石  阅读(2064)  评论(0编辑  收藏  举报