二叉链表存储结构
typedef struct BTNode{
ElemType data;
struct BTNode *lchild;
struct BTNode *rchild;
}BTNode;
1、二叉树的遍历算法
先序遍历
void preorder(BTNode *p){
if(p!=NULL){
visit(p);
preorder(p->lchild);
preorder(p->rchild);
}
}
中序遍历
void inorder(BTNode *p){
if(p!=NULL){
inorder(p->lchild);
visit(p);
inorder(p->rchild);
}
}
后序遍历
void postorder(BTNode *p){
if(p!=NULL){
postorder(p->lchild);
postorder(p->rchild);
visit(p);
}
}
2、求二叉树的深度
int getDepth(BTNode *p){
if(p==NULL){
return 0;
}
else{
int l = getDepth(p->lchild);
int r = getDepth(r->rchild);
return l>r?l+1:r+1;
}
}
3、二叉树的层次遍历
算法思想:
- 初始化一个辅助队列
- 根节点入队
- 若队列非空,则队头结点出队,访问该结点,将左右孩子插入队尾
- 重复3直至队列为空
void levelOrder(BTNode *p){
LinkQueue Q;
InitQueue(Q);
BTNode *q;
EnQueue(Q, p);
while(IsEmpty(Q)){
DeQueue(Q, q);
visit(q);
if(q->lchild!=NULL){
EnQueue(Q, q->lchild);
}
if(q->rchild!=NULL){
EnQueue(Q, q->rchild);
}
}
}
4、暴力法找中序前驱
按照中序遍历的顺序,设置两个指针,其中一个为另一个的前驱,移动到目标结点。
void findPre(BTree T){
if(T!=NULL){
findPre(T->lchild);
visit(T);
findPre(T->rchild);
}
}
void visit(BTNode *q){
BTNode *p; //指向目标结点
BTNode *pre = NULL; //指向当前访问结点的前驱
BTNode *final = NULL; //记录最终结果
if(p == q)
final = pre;
else
pre = q;
}
5、中序线索化
typedef struct ThreadNode{
ElemType data;
struct ThreadNode *lchild, *rchild;
int ltag, rtag;
}ThreadNode, *ThreadTree
ThreadNode *pre = NULL; //全局变量
void InThread(ThreadTree T){
if(T!=NULL){
InThread(T->lchild);
visit(T);
InThread(T->rchild);
}
}
void visit(ThreadNode *q){
if(q->lchild==NULL){
q->lchild = pre;
q->ltag = 1;
}
if(pre!=NULL && pre->rchild==NULL){
pre->rchild = q;
pre->rtag = 1;
}
pre = q;
}
void CreateInThread(ThreadTree T){
pre = NULL;
if(T!=NULL){
InThread(T);
if(pre->rchild==NULL){
pre->rtag = 1;
}
}
}
6、中序线索二叉树找中序后继
//找到以p为根的子树中,第一个被中序遍历的结点
ThreadNode *Firstnode(ThreadNode *p){
//循环找到最左下结点(不一定是叶结点)
while(p->ltag==0) p=p->lchild;
return p;
}
//在中序线索二叉树中找到结点p的后继结点
ThreadNode *Nextnode(ThreadNode *p){
if(p->rtag==0)
return Firstnode(p->rchild);
else
return p->rchild;
}
//对中序线索二叉树进行中序遍历(利用线索实现的非递归算法)
void Inorder(ThreadNode *T){
for(ThreadNode *p=Firstnode(T);p!=NULL;p=Nextnode(p))
visit(p);
}
空间复杂度:O(1)
中序线索二叉树 | 先序线索二叉树 | 后序线索二叉树 | |
---|---|---|---|
找前驱 | 左子树最右下结点 | × | 有右孩子是右孩子,无右孩子是左孩子 |
找后继 | 右子树最左下结点 | 有左孩子是左孩子,无左孩子是右孩子 | × |