0
点赞
收藏
分享

微信扫一扫

学习笔记 二叉树 (接上一篇)

我是小瘦子哟 2022-04-17 阅读 59
数据结构

8、二叉树的链式存储结构类型描述
typedef struct BiTNode {
int data;
struct BiTNode *lchild, *rchild;
}BiTNode,*BiTree;
9、此部分程序中涉及到栈和队列的部分在前面几篇中提到,在这里就不详细给出咯。

1)先序遍历
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 inorder1(BiTree T)
{
Sqstack S;
initstack(S);
BiTree p = T;
while (p||!stackempty(S))
{
if (p)
{
push(S, p->data);
p = p->lchild;
}
else
{
pop(S, p->data);
visit(p);
p = p->rchild;
}
}
}
4)后序遍历
void postorder(BiTree T)
{
if (T != NULL)
{
postorder(T->lchild);
postorder(T->rchild);
visit(T);
}
}
5)后序遍历非递归
void postorder1(BiTree T)
{
Sqstack S;
BiTNode *r,*p;
//BiTree p;
initstack(S);
p = T;
r = NULL;
while (p||!stackempty(S))
{
if (p)
{
push(S, p->data);
p = p->lchild;
}
else
{
pop(S, p->data);
if (p->rchild&&p->rchild != r)
{
p = p->rchild;
push(S, p->data);
p = p->lchild;
}
else
{
pop(S, p->data);
visit(p);
r = p;
p = NULL;
}
}
}
}
6)层序遍历
void levelorder(BiTree T)
{
Sqstack S;
SqQueue Q;
initqueue(Q);
initstack(S);
if(T!=NULL)
{
enqueue(Q, T->data);
while (!queueempty(Q))
{
dequeue(Q,T->data);
push(S, T->data);
if (T->lchild != NULL)
{
enqueue(Q, T->lchild->data);
}
if (T->rchild != NULL)
{
enqueue(Q, T->rchild->data);
}
}
while (!stackempty(S))
{
pop(S, T->data);
visit1(T->data);
}
}
}

10、二叉排序树非递归算法
BiTNode *bstsearch(BiTree T, int key, BiTNode *&p)
{
p = NULL;
while (T!=NULL&&key!=T->data)
{
p = T;
if (key < T->data)
{
T = T->lchild;
}
else
{
T = T->rchild;
}
}
return T;
}
11、二叉排序树的插入
int bstinsert(BiTree &T, int k)
{
if (T == NULL)
{
T = (BiTree)malloc(sizeof(BiTNode));
T->data = k;
T->lchild = T->rchild = NULL;
return 1;
}
else if (k == T->data)
{
return 0;
}
else if (k < T->data)
{
return bstinsert(T->lchild, k);
}
else
{
return bstinsert(T->rchild, k);
}
}
12、二叉排序树的构造
void bstcreate(BiTree &T, int str[], int n)
{
T = NULL;
int i = 0;
while (i<n)
{
bstinsert(T, str[i]);
i++;
}
}

13、线索二叉树的存储结构
typedef struct ThreadNode {
int data;
struct ThreadNode *lchild, *rchild;
int ltag, rtag;
}ThreadNode,*ThreadTree;
void visit(ThreadTree T)
{
printf("遍历树");
return;
}
1)求中序线索二叉树中中序序列下的第一个结点
ThreadNode *firstnode(ThreadNode *p)
{
while (p->ltag==0)
{
p = p->lchild;
}
return p;
}
2)求中序线索二叉树中结点p在中序序列下的后继结点
ThreadNode *nextnode(ThreadNode *p)
{
if (p->rtag == 0)
{
return firstnode(p->rchild);
}
else
{
return p->rchild;
}
}
3)不含头结点的中序线索二叉树的中序遍历
void inorder(ThreadNode *p)
{
for (ThreadNode *t = firstnode(p); t != NULL; t = nextnode(p))
{
visit(p);
}
}
4)中序遍历对二叉树线索化的递归算法
void inthread(ThreadTree &t, ThreadTree &pre)
{
if (t != NULL)
{
inthread(t->lchild, pre);
if (t->lchild == NULL)
{
t->lchild = pre;
t->ltag = 1;
}
if (pre != NULL && pre->rchild == NULL)
{
pre->rchild = t;
pre->rtag = 1;
}
pre = t;
inthread(t->rchild, pre);
}
}
5)中序遍历建立中序线索二叉树
void createinthread(ThreadTree T)
{
ThreadTree pre = NULL;
if (T != NULL)
{
inthread(T, pre);
pre->rchild = NULL;
pre->rtag = 1;
}
}

举报

相关推荐

0 条评论