【資料結構】數和二叉樹相關演算法
阿新 • • 發佈:2020-08-23
二叉樹的遍歷
先序遍歷
//先序遍歷
void InOrder(BiTree T) {
InitStack(S);
BiTree p = T;
while (p || !Empty(S)) {
if (p) {
visit(p);
Push(S, p);
p = p->lchild;
}
else {
Pop(S, p);
p = p->rchild;
}
}
}
中序遍歷
//中序遍歷 void InOrder(BiTree T) { InitStack(S); BiTree p = T; while (p || !Empty(S)) { if (p) { Push(S, p); p = p->lchild; } else { Pop(S, p); visit(p); p = p->rchild; } } }
後序遍歷
//後序遍歷 void PostOrder(BilTree T) { InitStack(S); p = T; r = null; //指向最近訪問過的 輔助指標 while (p || !IsEmpty(S)) { if (p) { Push(S, p); p = p->lchild; }else { GetTop(S, p); //讀棧頂 if (p->rchild && p->rchild != r) { push(S, p); p = p->rchild; } else { pop(S, p); visit(p->data); r = p; //標記訪問 p = null; //訪問後重置p指標 } } } }
層次遍歷
//層次遍歷
void LevelOrder(BiTree T) {
InitQueue(Q);
BiTree p;
EnQueue(Q, T);
while (!Empty(Q)) {
DeQueue(Q, p);
visit(p);
if (p->lchild != null) {
EnQueue(Q, p->lchild);
}
if (p->rchild != null) {
EnQueue(Q, p->rchild);
}
}
}
中序線索二叉樹
求第一個結點
//1、求第一個結點 ThreadNode* Firstnode(ThreadNode* p) { while (p->ltag == 0) { p = p->lchild; } return p; }
求p的後繼結點
//2、求p的後繼
ThreadNode* Nextnode(ThreadNode* p) {
if (p->rtag == 0) {
return Firstnode(p->rchild);
}
else {
return p->rchild;
}
}
不含頭結點遍歷的演算法
//3、不含頭結點的中序遍歷的演算法
void InOrder(ThearNode* T) {
for (ThreadNode* p = Firstnode(T); p != null; p = NextNode(p)) {
visit(p);
}
}
二叉排序樹
非遞迴查詢演算法
//二叉排序樹的非遞迴查詢演算法。
BSTNode* BST_Search(BiTree T, ElemType key) {
while (T != null && key != T->data) {
if (key < T->data) {
T = T->lchild;
}
else {
T = T->rchild;
}
}
return T;
}
插入操作演算法
//二叉排序樹插入操作的演算法
int BST_Insert(BiTree& T, KeyType k) {
if (T == null) { //如果樹為空,新插入的紀錄為根節點
T = (BiTree)malloc(sizeof(BSTNode));
T->key = k;
T->lchild = T->rchild = null;
return 1;
}
else if (k == T->key) { //如果有相同的,則插入失敗
return 0;
}
else if (k<T->key) {
return BST_Insert(T->lchild, k);
}
else {
return BST_Insert(T->rchild, k);
}
}
構造二叉排序樹
//構造二叉排序樹
void Creat_BST(BiTree& T, KeyType str[], int n) {
T = null;
int i = 0;
while (i < n) {
BST_Insert(T, str[i]);
i++;
}
}