給您帶來優質的代碼體驗,給您帶來歡喜^_^
課程名稱:數據結構
實驗項目名稱:二叉樹基本操作的實現
實驗目的:
1.掌握樹的基本操作—遍歷。
實驗要求:
1、 分別用遞歸和非遞歸的方法實現一棵樹的三種遍歷。
實驗過程:
1、 創建一棵二叉樹(二叉樹如下圖所示);
2、 用遞歸算法實現對該樹的三種遍歷;
3、 用非遞歸算法實現對該樹的三種遍歷;
4、 輸入選項:0或1,0爲遞歸遍歷,1爲非遞歸遍歷。
5、 根據輸入的選項,分別調用遞歸或非遞歸算法輸出先序、中序、後序遍歷序列。
實驗報告中給出先序和後序遍歷的非遞歸實現算法代碼。
實驗結果:
1、輸入:ABD##E##CF#G###(創建二叉樹)
2、輸入:0(遞歸算法)
3、輸出: 先序遍歷:ABDECFG
中序遍歷:DBEAFGC
後序遍歷:DEBGFCA
4、輸入:1(非遞歸實現)
5、輸出: 先序遍歷:ABDECFG
中序遍歷:DBEAFGC
後序遍歷:DEBGFCA
實驗分析:
1.分析遞歸與非遞歸實現的相同點及不同點;
2.列舉調試運行過程中出現的錯誤並分析原因。
要求:
(1) 程序要添加適當的註釋,程序的書寫要採用縮進格式。
(2) 程序要具在一定的健壯性,即當輸入數據非法時,程序也能適當地做出反應。
(3) 程序要做到界面友好,在程序運行時用戶可以根據相應的提示信息進行操作。
(4) 上傳源程序到課堂派。順序表的源程序保存爲TraversalBTree.cpp。
妙啊!簡直是妙啊!!做一道這麼有意思的題、領悟巧妙的算法難道不比玩遊戲、看小說強上100倍?
目前只寫出了遞歸算法的二叉樹遍歷,非遞歸的待補。。。
#include <stdio.h>
#include <iostream>
#include <algorithm>
#define MaxInt 32767
#define MVNum 100
#define OK 1
#define ERROR 0
using namespace std;
typedef int Status;
typedef char TElemType;
//二叉樹的二叉鏈表存儲表示
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//先序遍歷的遞歸算法
void PreOrderTraverse(BiTree T)
{
if(T)
{
cout<<T->data;
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
//中序遍歷的遞歸算法
void InOrderTraverse(BiTree T)
{
if(T)
{
InOrderTraverse(T->lchild);
cout<<T->data;
InOrderTraverse(T->rchild);
}
}
//後序遍歷的遞歸算法
void PostOrderTraverse(BiTree T)
{
if(T)
{
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
cout<<T->data;
}
}
//先序遍歷的順序建立二叉鏈表
void CreateBiTree(BiTree &T)
{
char ch;
printf("請依次輸入節點:");
cin>>ch;
if(ch=='#') T=NULL;
else
{
T=new BiTNode;
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
int main()
{
BiTree T;
CreateBiTree(T);
printf("請輸入一個數字0或1,0表示遞歸算法實現遍歷,1表示非遞歸算法實現遍歷:");
bool choose;
cin>>choose;
if(choose==0)
{
printf("先序遍歷:");
PreOrderTraverse(T);
puts("");
printf("中序遍歷:");
InOrderTraverse(T);
puts("");
printf("後序遍歷:");
PostOrderTraverse(T);
puts("");
}
return 0;
}