顺序存储 | 链式存储 |
---|---|
数组下标能反映二叉树中结点之间的逻辑关系比较适用于完全二叉树、满二叉树 | 每个结点有两个指针域,n个结点有2n个指针域,n+1个空链域(可用于构造线索二叉树) |
链式存储构建一个二叉树
(1)声明一个指向根节点的指针root,刚开始指向NULL
(2)插入根节点
(3)插入新节点(作为根节点的左孩子)
代码:
#include<bits/stdc++.h>
using namespace std;
//存储结构
struct ElemType {
int value;
};
typedef struct BiTNode {
ElemType data;
struct BiTNode *lchild,*rchild;
} BiTNode,*BiTree;
int main() {
//(1)声明一个指向根节点的指针root,刚开始指向NULL
BiTree root = NULL;
//(2)插入根节点
root = (BiTree)malloc(sizeof(BiTNode));
root->data = {1};
root->lchild = NULL;
root->rchild = NULL;
//(3)插入新节点(作为根节点的左孩子)
BiTNode * p = (BiTNode *)malloc(sizeof(BiTNode));
p->data = {2};
p->lchild = NULL;
p->rchild = NULL;
root->lchild = p;
printf("%d %d \n",root->data,root->lchild->data); //输出根节点的data 和 根节点的左孩子的地data
return 0;
}
二叉树的遍历
(1)先序遍历、中序遍历、后序遍历
//先序遍历
void PreOrder(BiTree T) {
if(T!=NULL) {
visit(T);
PreOrder(T->lchild);
PreOrder(T->rchild);
}
}
//中序遍历
void InOrder(BiTree T) {
if(T!=NULL) {
PreOrder(T->lchild);
visit(T);
PreOrder(T->rchild);
}
}
//后序遍历
void PostOrder(BiTree T) {
if(T!=NULL) {
PreOrder(T->lchild);
PreOrder(T->rchild);
visit(T);
}
}
(2)层次遍历
- 先构建一个辅助队列
- 根结点入队
- 若队列非空,则队头结点出队,访问该结点,并将其左、右孩子插入队尾(如果有的话)
- 重复第三步,直至队列为空
void LevelOrder(BiTree T){
LinkQueue Q;
InitQueue(Q);
BiTree p;
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;
}
}
来自王道