二叉树
二叉树的顺序存储
按满二叉树的结点层次编号,依次存放二叉树中的数据元素。
若有空节点则不能连续存储,空出位置!
二叉树顺序存储缺点
最坏情况:右单支树,深度为k的且只有k个结点的单支树需要长度为2k-1的一维数组。
特点:结点间蕴含在其存储位置中浪费空间,适合存满二叉树和完全二叉树。
二叉树的链式存储
二叉链表
typedef struct BiNode {
TElemType data;
struct BiNode* lchild, * rchild;//左右孩子指针
}BiNode,*BiTree;
三叉链表
再增加一个parent指针域指向双亲结点
typedef struct TriTNode {
TElemType data;
struct TriTNode* child, * parent, * rchild;
}TriTNode,*TriTree;
遍历二叉树
- 遍历定义 :顺着某一条搜索路径巡访二叉树中的结点,使得每个结点均被访问一次,而且仅被访问一次。
- 遍历目的 :得到树中所有结点的一个线性排列。
- 遍历用途 :它是树结构插入、删除、修改、查找和排序运算的前提,是二叉树一切运算的基础和核心。
遍历方法
假设: L :遍历左子树 D :访问根节点 R :遍历右子树
规定先左后右:
DLR ——先序遍历
LDR ——中序遍历
LRD ——后序遍历
先序遍历 | 中序遍历 | 后序遍历 |
---|---|---|
1.访问根结点 2.先序遍历左子树 3.先序遍历右子树 | 1.中序遍历左子树 2.访问根结点 3.中序遍历右子树 | 1.后序遍历左子树 2.后序遍历右子树 3.访问根节点 |
这里是二叉树的遍历方法,当初学二级公共基础知识(前面十分)的题就不会,点我点我!!!
复制一颗二叉树
Status Copy(BiTree T, BiTree& NewT)
{
if (T == NULL)
{
NewT = NULL;
return OK;
}
else
{
NewT = (BiTNode*)malloc(sizeof(BiTree));
NewT->data = T->data;
Copy(T->lchild, NewT->lchild);
Copy(T->rchild, NewT->rchild);
return OK;
}
}//Copy
计算二叉树的深度
int Depth(BiTree T)
{
int m = 1;
int n = 1;