前序中序非递归遍历树

本文介绍了如何使用C++语言通过递归方式实现二叉树的前序和中序遍历。对于后序遍历,则需要额外的标记来区分左右子节点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果只需要前序中序,则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");
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值