1. 程式人生 > 實用技巧 >【資料結構】數和二叉樹相關演算法

【資料結構】數和二叉樹相關演算法

二叉樹的遍歷

先序遍歷

//先序遍歷
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++;
	}
}