圖文均來自百度搜索
#include <iostream>
using namespace std;
struct BiTNode {
char data;
struct BiTNode *lchild, *rchild;//左右孩子
};
BiTNode*T;
void CreateBiTree(BiTNode* &T);
void Inorder(BiTNode* &T);
void PreOrderTraverse(BiTNode* &T);
void Posorder(BiTNode* &T);
//===========================================主函數
int main() {
cout << "創建一顆樹,其中A->Z字符代表樹的數據,用“#”表示空樹:" << endl;
CreateBiTree(T);
cout << "先序遞歸遍歷:" << endl;
PreOrderTraverse(T);
cout << endl;
cout << "中序遞歸遍歷:" << endl;
Inorder(T);
cout << endl;
cout << "後序遞歸遍歷:" << endl;
Posorder(T);
cout << endl;
return 1;
}
//=============================================先序遞歸創建二叉樹樹
void CreateBiTree(BiTNode* &T) {
//按先序輸入二叉樹中結點的值(一個字符),空格字符代表空樹,
//構造二叉樹表表示二叉樹T。
char ch;
if ((ch = getchar()) == '#')T = NULL;//其中getchar()爲逐個讀入標準庫函數
else {
T = new BiTNode;//產生新的子樹
T->data = ch;//由getchar()逐個讀入來
CreateBiTree(T->lchild);//遞歸創建左子樹
CreateBiTree(T->rchild);//遞歸創建右子樹
}
}//CreateTree
//===============================================先序遞歸遍歷二叉樹
void PreOrderTraverse(BiTNode* &T) {
//先序遞歸遍歷二叉樹
if (T) {//當結點不爲空的時候執行
cout << T->data;
PreOrderTraverse(T->lchild);//
PreOrderTraverse(T->rchild);
}
else cout << "";
}//PreOrderTraverse
//================================================中序遍歷二叉樹
void Inorder(BiTNode* &T) {//中序遞歸遍歷二叉樹
if (T) {//bt=null退層
Inorder(T->lchild);//中序遍歷左子樹
cout << T->data;//訪問參數
Inorder(T->rchild);//中序遍歷右子樹
}
else cout << "";
}//Inorder
//=================================================後序遞歸遍歷二叉樹
void Posorder(BiTNode* &T) {
if (T) {
Posorder(T->lchild);//後序遞歸遍歷左子樹
Posorder(T->rchild);//後序遞歸遍歷右子樹
cout << T->data;//訪問根結點
}
else cout << "";
}
前序遍歷:
訪問根結點,前序遍歷左子樹,前序遍歷右子樹 。
中序遍歷:
中序遍歷左子樹,訪問根結點,中序遍歷右子樹,我覺得這個投影法可以參考,方法如下:
後序遍歷:
後序遍歷左子樹,後序遍歷右子樹,訪問根結點