簡單遍歷二叉樹

/* 先序建立一棵任意二叉樹 */
/* 注意:輸入數據的順序頗有特色,本題輸入的順序要求爲,先是根節點,再是左子樹,再是右子樹 */

#include <iostream>
#include <malloc.h>
using namespace std;

typedef int ElementType; //給int起別名爲ElementType, typedef是起別名的意思
typedef struct bitnode //定義二叉樹節點數據類型
{
ElementType data;
struct bitnode *left, *right;
} bitnode, *bitree; //bitree爲指向bitnode這種結構的指針

//先序建立一棵二叉樹
bitree PerCreateTree()
{
bitree T;
ElementType item;
cin >> item;
if( item == 0 ) //葉節點數據標誌:其後根兩個0
T = NULL; //若某一節點爲葉子結點,則其左右子樹均爲NULL,0表示建空樹
else
{
T = (bitree)malloc(sizeof(bitnode));
T->data = item;

T->left = PerCreateTree(); //遞歸建立其左子樹
T->right = PerCreateTree(); //遞歸建立其右子樹
}

return T; //返回根節點
}

//先序遞歸遍歷二叉樹
void PerOrder(bitree T)
{
if( T ) // T != NULL
{
cout << T->data << " ";
PerOrder(T->left); //遞歸先序周遊其左子樹
PerOrder(T->right); //遞歸先序周遊其右子樹
}
} node

void InOrder(bitree T)
{
if(T)
{
InOrder(T->left);
cout<<T->data<<" ";
InOrder(T->right);
}
}ios


void inorder(bitree T)
{
//仍是模擬上面的遍歷過程
bitree ptr[20];
int top = -1;
/*下面的雙重判斷和前面的同樣,在進棧、出棧的過程當中可能會出現棧空的狀況,而此時的遍歷尚未結束,
因此須要據此來維持循環的進行。*/
while(T || top!=-1)
{
while(T)
{
ptr[++top] = T;
T = T->left;
}
if(top!=-1)
{
T = ptr[top--];
cout<<T->data<<" "; //輸出在出棧後
T = T->right;
}
}

}spa


//後序遞歸遍歷二叉樹
void PostOrder(bitree T)
{
if( T ) // T != NULL
{
PostOrder(T->left); //遞歸先序周遊其左子樹
PostOrder(T->right); //遞歸先序周遊其右子樹
cout << T->data << " ";
}
}

//釋放空間
bitree FreeTree(bitree T)
{
if( T )
{
FreeTree(T->left); //遞歸釋放其左子樹
FreeTree(T->right); //遞歸釋放其右子樹

free(T); //釋放根節點
T = NULL; //釋放指向根節點的指針
}

return T; //返回釋放後的根節點NULL
}

int main()
{
bitree root;

cout << "請輸入數據先序建立一棵二叉樹:";
root = PerCreateTree(); //先序建立一棵二叉樹

cout << "先序遞歸遍歷的結果:";
PerOrder(root); //先序遞歸遍歷
cout << endl;指針

cout << "中序遞歸遍歷的結果:";
InOrder(root); //中序遞歸遍歷
cout << endl;code

cout << "中序非遞歸遍歷的結果:";
inorder(root); //中序非遞歸遍歷
cout << endl;blog

cout << "後序遞歸遍歷的結果:";
PostOrder(root); //後序遞歸遍歷
cout << endl;

return 0;
}遞歸

運行結果:ci

請輸入數據先序建立一棵二叉樹:4 6 8 0 0 1 0 0 2 0 0
先序遞歸遍歷的結果:4 6 8 1 2
中序遞歸遍歷的結果:8 6 1 4 2
中序非遞歸遍歷的結果:8 6 1 4 2
後序遞歸遍歷的結果:8 1 6 2 4it

相關文章
相關標籤/搜索