下面展示一些 行內代碼片,
// A code block
var foo = 'bar';
// An highlighted block
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef char TElemType;
typedef enum { Link, Thread } PointerTag;
typedef struct BiThrNode {
TElemType data;
struct BiThrNode* lchild, * rchild;
PointerTag LTag;
PointerTag RTag;
}BiThrNode, * BiThrTree;
void visit(BiThrTree T) {
printf("%c", T->data);
}
//線索二叉樹初始化
Status CreateBiThrNode(BiThrTree* B) {
char ch;
scanf_s("%c", &ch);
if (ch == '#') *B = NULL;
else {
if (!((*B) = (BiThrNode*)malloc(sizeof(BiThrNode)))) exit(OVERFLOW);
(*B)->data = ch;
(*B)->LTag = Link;
(*B)->RTag = Link;
CreateBiThrNode(&(*B)->lchild);
CreateBiThrNode(&(*B)->rchild);
}
return OK;
}
//線索二叉樹線索化
void InThreading(BiThrTree B, BiThrTree* pre) {
if (!B) return;
InThreading(B->lchild, pre);
if (!B->lchild) {
B->LTag = Thread;//節點左指標指向前驅結點
B->lchild = *pre;
}
if (!(*pre)->rchild) {
(*pre)->RTag = Thread;//右指標指向后驅節點;
(*pre)->rchild = B;
}
*pre = B;
InThreading(B->rchild, pre);
}
//為線索二叉樹添加頭結點,使之可以雙向操作
Status InOrderThreading(BiThrTree* Thrt, BiThrTree T) {
if (!(*Thrt = (BiThrTree)malloc(sizeof(BiThrNode)))) exit(OVERFLOW);
(*Thrt)->LTag = Link;//左指標指向左孩子
(*Thrt)->RTag = Thread;右指標指向后驅節點;
(*Thrt)->rchild = (*Thrt);
if (!T) {
(*Thrt)->lchild = (*Thrt);
return OK; //若根結點不存在,則該二叉樹為空,讓該頭結點指向自身.
}
BiThrTree pre;
//令頭結點的左指標指向根結點
pre = (*Thrt);
(*Thrt)->lchild = T;
//開始遞回輸入線索化
InThreading(T, &pre);
//此時結束了最后一個結點的線索化了,下面的代碼把頭結點的后繼指向了最后一個結點.
//并把最后一個結點的后繼也指向頭結點,此時樹成為了一個類似雙向鏈表的回圈.
pre->rchild = *Thrt;
pre->RTag = Thread;//右指標指向后驅節點;
(*Thrt)->rchild = pre;
return OK;
}
//非遞回遍歷線索二叉樹
Status InOrderTraverse(BiThrTree T) {
BiThrTree p = T->lchild;
while (p != T) {
while (p->LTag == Link)p = p->lchild;//走向左孩子盡頭;
visit(p);//
while (p->RTag == Thread && p->rchild != T) {//訪問該節點的后續節點;
p = p->rchild;
visit(p);
}
p = p->rchild;
}
return OK;
}
int main() {
BiThrTree B, T;
CreateBiThrNode(&B);
InOrderThreading(&T, B);
printf("結果為:");
InOrderTraverse(T);
}
//測驗資料:abc##de#g##f###
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/279326.html
標籤:其他
下一篇:LCD1602自定義符號的使用
