typedef struct BiNode
{
int data;
struct BiNode *lChild;
struct BiNode *rChild;
}*BiTree;
typedef struct MarkNode //保存標記信息的節點
{
BiNode *node;
bool tag; // true:表示節點node的左右子樹已經都被訪問
}MarkNode;
//構建二叉樹
void Create(BiTree &T)
{
char ch;
cin >> ch;
if (ch == '#') //如果到了葉子節點,接下來的左、右子樹分別賦值爲#
{
T = NULL;
}
else
{
T = (BiNode*)malloc(sizeof(BiNode));
T->data = ch;
Create(T->lChild); //遞歸創建左子樹
Create(T->rChild); //遞歸創建右子樹
}
}
// 非遞歸前序遍歷
void PreOrder(BiTree T)
{
if (T == NULL) return;
stack<BiNode*> s;
BiNode *p = T;
s.push(p);
while (!s.empty())
{
p = s.top();
s.pop();
while (p != NULL)
{
printf("%c ", p->data);
if (p->rChild != NULL)
{
s.push(p->rChild);
}
p = p->lChild;
}
}
cout << endl;
}
// 非遞歸中序遍歷
void InOrder(BiTree T)
{
if (T == NULL)return;
stack<BiNode*> s;//聲明一個棧存儲節點
BiNode *p = T;
while (!s.empty() || p!=NULL)
{
while (p!=NULL)
{
s.push(p);//一直存儲左節點
p = p->lChild;
}
p = s.top();
s.pop();//該節點出棧
printf("%c ", p->data);//不存在左節點,輸出該節點
p = p->rChild;//查找該節點的右子樹
}
cout << endl;
}
// 非遞歸後序遍歷
void PostOrder(BiTree T)
{
if (T == NULL) return;
stack<MarkNode> s;
BiNode *p = T;
while (p != NULL || !s.empty())
{
while (p != NULL)
{
MarkNode mark;
mark.node = p;
mark.tag = false;
s.push(mark);
p = p->lChild;
}
while (!s.empty() && s.top().tag)
{
printf("%c ",s.top().node->data);
s.pop();
}
if (!s.empty())
{
s.top().tag = true;
p = s.top().node->rChild;
}
}
cout << endl;
}
//廣度優先遍歷BFS - 隊列
void BFS(BiTree T)
{
if (T == NULL)
{
return;
}
queue<BiNode*> q;
BiNode* p = T;
q.push(p);
while (!q.empty())
{
p = q.front();
q.pop();
printf("%c ", p->data);
if (p->lChild)
{
q.push(p->lChild);
}
if (p->rChild)
{
q.push(p->rChild);
}
}
cout << endl;
}
//深度優先遍歷DFS - 棧
void DFS(BiTree T)
{
if (T == NULL) return;
stack<BiNode*> s;
BiNode* p = T;
s.push(p);
while (!s.empty())
{
p = s.top();
s.pop();
printf("%c ", p->data);
if (p->rChild)
{
s.push(p->rChild);
}
if (p->lChild)
{
s.push(p->lChild);
}
}
cout << endl;
}
//樹的深度
int depth(BiTree T)
{
if (T == NULL)
{
return 0;
}
else
{
int left = depth(T->lChild) + 1;
int right = depth(T->rChild) + 1;
return left > right ? left : right;
}
}
int main()
{
//測試數據:
//ABD##E##CF##G##
//AB##C##
BiTree T = NULL;
Create(T);
cout << "前序遍歷:" << endl;
PreOrder(T);
cout << "中序遍歷:" << endl;
InOrder(T);
cout << "後序遍歷:" << endl;
PostOrder(T);
cout << "廣度優先遍歷:" << endl;
BFS(T);
cout << "深度優先遍歷:" << endl;
DFS(T);
cout << "樹的深度:" << endl;
cout << depth(T) << endl;
system("pause");
return 0;
}