目录
树
一、树的定义与基本术语
知识总览
1、树的基本概念
2、基本术语
1.结点之间的关系描述
祖先结点:从一个结点出发,向上延申到根结点为止,这条路径上所经过的所有结点。比如上图,父亲,爷爷是你的祖先节点。
子孙结点:从一个结点出发,底下所产生的所有分支结点,比如上图k,L是你的子孙结点。
双亲结点(父结点):一个结点的直接前驱,
孩子结点:一个结点的直接后继,如k,L是你的孩子结点
兄弟结点:位于同一层次且父结点相同的结点,如F是你的兄弟结点
堂兄弟结点:位于同一层次且父结点不相同的结点,如G,H,I,J是你的堂兄弟结点
2、结点、树的属性描述
3、有序树、无序树
4、森林
二、树的性质
二叉树
一、二叉树的定义和基本术语
1、二叉树的基本概念
2、几个特殊的二叉树
1.满二叉树
一棵高度为h,且含有2的h次方-1结点个结点的二叉树
2、完全二叉树
3、二叉排序树
4、平衡二叉树
二、二叉树的存储结构
1、顺序结构
顺序存储主要适用于完全二叉树
2、链式结构
//二叉树的链式存储
#include <stdio.h>
#include <stdlib.h>
struct Elemtype
{
int value;
};
typedef struct BiTNode
{
Elemtype data;
struct BiTNode* lchild, * rchild;
//struct BiTNode* parent;//父指针,指向父节点,三叉链表
}BiTNode,*BiTree;
int main()
{
//定义一个空树
BiTree root = NULL;
//插入根结点
root = (BiTree)malloc(sizeof(BiTNode));
root->data = { 1 };
root->lchild = NULL;
root->rchild = NULL;
//插入新结点
BiTNode* p = (BiTNode*)malloc(sizeof(BiTNode));
p->data = { 2 };
p->lchild = NULL;
p->rchild = NULL;
root->lchild = p;//作为根结点的左孩子
return 0;
}
三、二叉树的先/中/后序遍历
1、先序遍历
具体代码
#include <stdio.h>
struct ElemType
{
int value;
};
typedef struct BiTNode
{
ElemType data;
struct BiTNode* lchild, * rchild;
}BiTNode, * BiTree;
//先序遍历
void PreOrder(BiTree T)
{
if (T != NULL)
{
visit(T);//访问根结点
PreOrder(T->lchild);//递归遍历左子树
PreOrder(T->rchild);//递归遍历右子树
}
}
2、中序遍历
具体代码
//中序遍历
void InOrder(BiTree T)
{
if (T != NULL)
{
InOrder(T->lchild);//递归遍历左子树
visit(T);//访问根结点
InOrder(T->rchild);//递归遍历右子树
}
}
3、后序遍历
具体代码
//后序遍历
void PostOrder(BiTree T)
{
if (T != NULL)
{
PostOrder(T->lchild);//递归遍历左子树
PostOrder(T->rchild);//递归遍历右子树
visit(T);//访问根结点
}
}