如果只需要前序中序,则Node中是不需要flag的。但是如果是在后序中,则需要。
#include<iostream>
#include<stdlib.h>
#include<stack>
#include<queue>
using namespace std;
class Node{
public:int data;
Node *pLeft = NULL;
Node *pRight = NULL;
};
void feidiguiqianxubianli(Node *pRoot){
/*首先把第一个节点给pNode,如果非NULL,则cout,并push,然后pNode=pNode->Left,非NULL,则cout,并push,然后……
如果是NULL,pop出来,准备访问right,但是访问的是pop出来的right,
所以在pop之前,先将其进行赋给另一个变量,再讨论right的有无left,若有,则重复上面,
结束的标志是栈为空
*/
stack<Node*> mystack;
Node *pnow = pRoot;
while (pnow != nullptr || false == mystack.empty())
{
while (pnow)
{
cout << pnow->data << " " ;
mystack.push(pnow);
pnow = pnow->pLeft;
}
pnow = mystack.top();
mystack.pop();
pnow = pnow->pRight;
}
}
void feidiguizhongxubianli(Node *pRoot){
/*首先把第一个节点给pNode,如果非NULL,则push,然后访问左孩子,如果左孩子非空,则继续访问,
如果做左孩子是空的,则cout top,并且pop,
转到右孩子,检查右孩子是否有左孩子,如果有左孩子,则push,再看是否有左孩子,……循环前面的。
所以循环的点在转到右孩子之后再转到左孩子的时候。
*/
stack<Node*> mystack;
Node *pnow = pRoot;
while (pnow != nullptr || false == mystack.empty())
{
while (pnow)
{
mystack.push(pnow);
pnow = pnow->pLeft;
}
pnow = mystack.top();
mystack.pop();
cout << pnow->data << " ";
pnow = pnow->pRight;
}
}
int main(){
Node *pRoot;//简单粗暴的方法初始化一棵树,重点不在这,大家自己进行脑补
Node s1;
Node s2;
Node s3;
Node s4;
Node s5;
Node s6;
Node s7;
s1.data = 1;
s2.data = 2;
s3.data = 3;
s4.data = 4;
s5.data = 5;
s6.data = 6;
s7.data = 7;
pRoot = &s1;
s1.pLeft = &s2;
s1.pRight = &s3;
s2.pLeft = &s4;
s2.pRight = &s5;
s3.pLeft = &s6;
s3.pRight = &s7;
cout << "前序遍历的结果为: " << endl;
qianxubianli(pRoot);
cout << "中序遍历的结果为: " << endl;
zhongxubianli(pRoot);
cout << "后序遍历的结果为: " << endl;
houxubianli(pRoot);
system("pause");
}