C语言/C++:二叉树非递归后序遍历的最简算法

通过使用两个栈,一个用于输出内容,另一个存储左节点,实现二叉树的非递归后序遍历。从根节点开始,向右推进,遇到节点存入输出栈s1,左节点存入辅助栈s2。当右节点为空且s2不为空时,从s2出栈并重复此过程,直至s2为空。该方法减少了栈操作,节省内存,提高速度。同样思路适用于先序和中序遍历。

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

使用两个栈,一个栈s1用于存储输出内容,另一个栈s2用于存储左节点。

大概流程是从根节点开始,不断向右前进,将遇到的节点都存储进s1,若遇到的节点有左节点则将其左节点存入s2。前进到右节点为空之后,如果s2不为空,则将存储左节点的s2出栈,继续从此出栈的元素开始,不断向右推进,即重复上一步骤,直到s2为空,退出循环。

void postOrder(TreeNode *TT){
    Stack s1,s2;      // 创建初始化顺序栈。
    while(1)
        if(TT){
            s1.push(TT);    //将遇到的节点都推进s1
            if(TT->lchild) s2.push(TT->lchild);     //将左节点推进s2
            TT = TT->rchild;     //向右前进
        }else{
            if(s2.isEmpty()) break;    //退出循环
            TT = s2.pop();     //回到刚刚存储的左节点
        }

    while(!s1.isEmpty()) printf("%d\t",s1.pop());    //s1依次出栈
}

类似的思想可以用于二叉树的先序和中序遍历算法上。相较于传统算法,这种方法对栈的操作量更少,因此占用内存更少,且运行速度更快。

先序遍历:

void preOrder(treeNode* TT){
	Stack st;    //创建一个栈,用于记录右节点
	while(1)
		if(TT){
			print("%d\t", TT->data);
			if(TT->rchild) st.push(TT->rchild);
			TT = TT->lchild;    //向左推进
		}else{
			if(st.isEmpty()) break;
			TT = s
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值