二叉树前序中序后序的非递归遍历

本文详细介绍了二叉树的三种遍历方法:前序、中序和后序遍历,并提供了具体的实现代码示例。每种遍历方法都遵循特定的节点访问顺序,有助于深入理解二叉树的数据结构。

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

1前序遍历

按照根左右的顺序进行遍历,首先访问根节点,若左孩子非空,访问左子树;右孩子非空访问右子树。以此规则遍历整个二叉树

(1)当前点入栈,输出该节点

(2)如当前节点左孩子非空,访问该节点的左孩子回到(1)

(3)若当前节点左孩子为空,访问该节点右孩子回到(1)

    stack<TreeNode*>s;
	vector<int> res;
    TreeNode *p=root;
	while(p!=NULL||!s.empty())
	{
	    while(p)
	    {
	        res.push_back(p->val);
	        s.push(p);
	        p=p->left;
	    }
	    if(!s.empty())
	    {
	        p=s.top();
	        s.pop();
	        p=p->right;
	    }
	}

2中序遍历

和前序遍历思路一样,只不过当左孩子为空才访问当前节点

(1)当前点入栈

(2)如当前节点左孩子非空,访问该节点的左孩子回到(1)

(3)若当前节点左孩子为空,输出该节点并访问该节点右孩子回到(1)

stack<TreeNode*>s;
	vector<int> res;
    TreeNode *p=root;
	while(p!=NULL||!s.empty())
	{
	    while(p)
	    {
	        s.push(p);
	        p=p->left;
	    }
	    if(!s.empty())
	    {
	        p=s.top();
	        respush_back(p->val);
	        s.pop();
	        p=p->right;
	    }
	}

3后序遍历

按照左右根的顺序遍历二叉树,对于任一节点,若无左右孩子或者左右孩子均已访问,才可输出。同时为保证先输出左孩子,应先处理右子树。

stack<TreeNode*>s;
	vector<int> res;
    TreeNode *p=root;
	TreeNode *pre=NULL;     //前一节点
	while(!s.empty())
	{
	    p=s.top();
	    if((p->left==NULL&&p->right==NULL)||(pre!=NULL&&(pre==p->left||pre==p->right)))
	    {
	        res.push_back(p->val);
	        s.pop();
	        pre=p;
	    }
	    else
	    {
	        if(p->right) p=p->right;
	        if(p->left) p=p->left;
	    }
	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值