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;
}