設計和調試的算法希望對你們有用喲:
1、遞歸建立二叉樹;
2、先序遞歸遍歷二叉樹;
3、中序遞歸遍歷二叉樹;
4、後序遞歸遍歷二叉樹。
5、中序非遞歸遍歷二叉樹
首先要建立一個工程,編譯器用codeblocks, vc 6.0等,都能運行,但是可能需要自己調試一下,畢竟每個編譯器的環境都是不一樣的。
頭文件//header,h
#include <cstdlib>
#include <cstdio>
#include <iostream>
#include <windows.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW-2
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
using namespace std;
//Status是函數的類型,其值是函數結果狀態代碼
typedef int status;
typedef int TelemType;
算法頭文件//Bitree.h
#include"header.h"
typedef struct BiTNode {
TelemTypedata;
structBiTNode *lchild,*rchild;
} BiTNode,*BiTree;
typedef BiTree SElemType;
typedef struct {
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
status InitStack(SqStack &S) {
S.base =(SElemType *)malloc (STACK_INIT_SIZE*sizeof (SElemType));
if(!S.base) exit (OVERFLOW);
S.top =S.base;
S.stacksize= STACK_INIT_SIZE;
return OK;
}//InitStack
status StackEmpty(SqStack S)
{
if (S.base==S.top)
return TRUE;
return FALSE;
}
status Push(SqStack &S, SElemType &e) {
if (S.top-S.base>=S.stacksize) //棧滿
{ S.base=(SElemType *)realloc
(S.base, (S.stacksize+STACKINCREMENT)
* sizeof(SElemType));
if (!S.base) exit (OVERFLOW);
S.top = S.base + S.stacksize;
S.stacksize+=STACKINCREMENT;
} // if
*S.top++ = e; return OK; } //Push
status Pop(SqStack &S, SElemType &e) {
if(S.top == S.base)return ERROR;
e = * -- S.top;
return OK;
} //Pop
status CreateBiTree(BiTree &T){
//按先序次序輸入二叉樹中結點的值,空格表示空樹
//生成二叉樹的二叉鏈表存儲結構,T爲根結點指針]
char ch;
cin>>ch;
if (ch==' ')T=NULL;
else{
if(!(T=(BiTNode *) malloc(sizeof(BiTNode)))) exit(OVERFLOW);
T->data=ch; //建立根結點
CreateBiTree( T->lchild); //建立左子樹
CreateBiTree(T->rchild); //建立右子樹
}
return OK;
} //CreateBiTree
status PrintElement(TelemType e)
{
cout<<e; //輸出元素值
return OK;
}
status PreorderTraverse(BiTree T, status(*visit)(TelemType e)) {
//先序遍歷根結點指針爲T的二叉樹
if (T) {
if(visit(T->data))
if(PreorderTraverse(T->lchild,visit))
if(PreorderTraverse(T->rchild,visit)) return OK;
returnERROR;
}elsereturn OK; //if (T)
}//PreorderTraverse
status InorderTraverse1(BiTree T, status(*visit)(TelemType e)) {
//先序遍歷根結點指針爲T的二叉樹
if(T) {
if(InorderTraverse1(T->lchild,visit))
if(visit(T->data))
if(InorderTraverse1(T->rchild,visit)) return OK;
returnERROR;
}elsereturn OK; //if (T)
}//InorderTraverse
status PostorderTraverse(BiTreeT, status(*visit)(TelemType e)) {
//後序遍歷根結點指針爲T的二叉樹
if (T) {
if(PostorderTraverse(T->lchild,visit))
if(PostorderTraverse(T->rchild,visit))
if(visit(T->data)) return OK;
returnERROR;
}elsereturn OK; //if (T)
}//PostorderTraverse
status InorderTraverse2(BiTree T,status(*visit)(TelemType e)) {
SqStack S;
InitStack(S); BiTree p = T;
while(p || !StackEmpty(S) ){ // 找到最左下的結點
if(p)
{ Push(S,p); p=p->lchild; } // 根指針進棧,遍歷左子樹
else { //根指針退棧,訪問根結點,遍歷右子樹
Pop(S,p); if (!visit(p->data) ) return ERROR;
p=p->rchild;
}//else
}// while
return OK;
}// InOrderTraverse
主函數//main.cpp
#include"header.h"
#include"Bi tree.h"
int main()
{
BiTree T;
cout<< "Please input characters to create a tree" << endl;
CreateBiTree(T);
cout<<endl<< "preorder traverse the tree:"<<endl;
PreorderTraverse(T, PrintElement);
cout<<endl<<"inorder traverse thw tree:digui"<<endl;
InorderTraverse1(T,PrintElement);
cout<<endl<<"Inorder traverse the tree:feidigui"<<endl;
InorderTraverse2(T,PrintElement);
cout<<endl<<"Postorder traverse the tree:"<<endl;
PostorderTraverse(T,PrintElement);
return 0;
}