总结点:n
度为0:n0
度为1:n1
度为2:n2
n=n2+n1+n0
n0=n2+1
常考基本操作:
i的做孩子:2i
i的右孩子:2i-1
i的父节点:i/2向下取整
i所在层次:log2^(n+1)向上取整,log2^n向下取整+1
存储结构
一、顺序存储
只用于存储完全二叉树
//定义结构体
#define MaxSize 100
struct TreeNode{
ELemType value;//结点中的数据元素
bool isEmpty;//结点是否为空
};
TreeNode t[MaxSize];//数组存储二叉树中各结点
for(int i=0;i<MaxSize;i++){
t[i].isEmpty=true;
}//初始化标记所有节点为空
二、链式存储
struct ElemType{
int value;
}
typedef struct BiTNode{
ElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//n个结点的二叉链表共有n+1个空链域
BiTree root =NULL; //定义一颗空树
//插入根节点
root=(BiTree)malloc(sizeof(BiTree));
root->data={1};
root->lchild=NULL;
root->rchild=NULL;
//插入新节点
BiTree*p=(BiTree*)malloc(sizeof(BiTree));
p->data={2};
p->lchild=NULL;
p->rchild=NULL;
root->lchild=p;
//三叉链表 需要频繁查找父节点
typedef struct BiTNode{
ElemType BiTNode *lchild,*rchild;
struct BiTNode *parent;
}BiTNode,*BiTree;
中序遍历
void InOrder(BiTree T){
if(T!=NULL){
InOrder(T->lchild); //递归遍历左子树
visit(T); //访问根节点
InOrder(T->rchild); //递归遍历右子树
}
}
空间复杂度O(h)
由此可以相同可以得到前序(PreOrder)和后序(PostOrder)遍历
层序遍历
初始化队列
根节点入队
队头非空,队头节点出队,访问该节点,将其左、右孩子插入队尾
重复直至队空
void LevelOrder(BiTree T){
EnQueue(Q,T); //根节点入队
while(!IsEmpty(Q)){
DeQueue(Q,P);
Visit(P);
if(P->lchild!=NULL)
EnQueue(Q,p-lchild);
if(P->rchild!=NULL)
EnQueue(Q,p->rchild);
}
}
求树的深度/高度
int treeDepth(BiTree T){
if(T==NULL){
return 0;
}
else{
int l=treeDepth(T->lchild)
int r=treeDepth(T->rchild)
return l>r?l+1:r+1;
}
}