数据结构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;
}
作者:markbin
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.