第二十八天:二叉树的中序遍历

本文深入探讨了二叉树的非递归中序遍历算法,通过实例讲解了遍历过程,并修复了常见错误,强调了边界条件的重要性。

今天是释然发题解的第二十八天,以后会经常和大家分享学习路上的心得,希望和大家一起进步,一起享受coding的乐趣
本文约1400字,预计阅读5分钟
昨天我们学习了二叉树,忘记的小伙伴们可以看一下哦:
二叉树

今天我们来聊一聊二叉树的中序遍历,明天和大家分享二叉树的后序遍历的问题的相关题目:

非递归的中序遍历

实现

我们想一下假如说一棵树是这样的:

[
3,9,20,null,null,15,7
]

这棵树应该长这样:

    3
   / \
  9  20
    /  \
   15   7

二叉树的中序遍历和前序遍历不一样,如果左子树始终有结点存在,那么第一个输出的结点门就应该是最左下角的那个,所以当我们把根节点压入栈的时候,我们就需要不断地把左边界压入栈,即不停地

temp=temp.left;

直到找到的那个结点为空为止,这个时候就弹出这个结点,开始找这颗子树的右结点的左子树(虽然讲的非常变扭,其实自己画个图就好)然后不停地找左子树

为什么要不停地找左子树呢?很简单,中序遍历最先需要遍历的就是左子树的左孩子,但是一个结点对于自己的左孩子来说其实就是父亲,不能第一个打印,因此必须不停地找左孩子
最后栈为空时,停止

实现

当我们理解了这个过程以后其实相对就很容易啦!

//非递归的中序遍历
void InOrder(Node root)
{
    if (root == null)
    {
        return;
    }
    stack<Node> stack;
    //vector<int> result;
    // 先把根节点压栈
    stack.push(root);
    while (!stack.empty())
    {
        if(root!=NULL)
        {
            stack.push(root);
            root=root.left;
        }
        else
        {
            root = stack.pop();
            cout<<root.val;
            root=root.right;
        }
    }
    cout<<" "<<endl;
}

真的就完成了嘛?

我们来测试一组边界数据:假设这棵树只有一个结点存储的是3

 	3
   / \
NULL NULL

我们把3压栈,这个时候我们再把3压栈,发现无论如何这个3会至少会打印2次,所以这个代码有错误。我们再想想,为啥之前会有一个压栈的操作,就是为了让栈非空,那么我们可以把这句话删除

 // 先把根节点压栈
    stack.push(root);

然后修改一下这段

while (!stack.empty() || root!=NULL)

这样这个程序就不会中途停止了
我们再来对更多的数据进行测试

 		3
   	   / \
  	  9  20
    / \  / \
  15  7 2   8

发现是没有问题的,考虑问题一定要考察边界条件,特殊数据这是为什么每次总觉得自己都是对的,但是却不能AC的原因了,希望自己在以后的做题过程中慢慢变好吧

当然咯复杂度的问题也是我们需要考虑的问题,如果能够做到优化和剪枝,那么自己的代码一定也能够让面试官眼前一亮

好了,今天的二叉树的中序遍历就到这里。
释然每天发布一点自己学习的知识,希望1年后我们也能在ACM的赛场上见面,一起去追寻自己的程序猿之路吧!

后期也会和大家一起分享学习心得和学习经验呢,明天我们不见不散哦!

下期预告:

二叉树的后序遍历
如果大家有什么建议或者要求请后台留言,释然也想和大家一起进步呀!
联系方式:shirandexiaowo@foxmail.com

Description 用函数实现如下二叉排序树算法: (1) 插入新结点 (2) 前序、中序、后序遍历二叉树 (递归) (3) 前序、中序、后序遍历的非递归算法 (4) 层次遍历二叉树5) 在二叉树中查找给定关键字(函数返回值为成功1,失败0) (6) 交换各结点的左右子树 (7) 求二叉树的深度 (8) 叶子结点数 (9) 删除某结点 输入格式 第一行:准备建树的结点个数n 第二行:输入n个整数,用空格分隔 第三行:输入待查找的关键字 第四行:输入待查找的关键字 第五行:输入待插入的关键字 第六行:输入待删除的关键字 输出格式 第一行:二叉树的先序遍历序列 第二行:二叉树的中序遍历序列 第三行:二叉树的后序遍历序列 第四行:查找结果 第五行:查找结果 第六行~第八行:插入新结点后的二叉树的先、中、序遍历序列 第九行:插入新结点后的二叉树的中序遍历序列(非递归算法) 第十行:插入新结点后的二叉树的层次遍历序列 第十一行:删除结点后的二叉树的中序遍历序列(非递归算法) 第十二行:删除结点后的二叉树的层次遍历序列 第十三行~第十五行:第一次交换各结点的左右子树后的先、中、后序遍历序列 第十六行~第十八行:第二次交换各结点的左右子树后的先、中、后序遍历序列 第十九行:二叉树的深度 第二十行:叶子结点数
最新发布
06-06
Description 用函数实现如下(平衡)二叉排序树算法: (1) 插入新结点 (2) 前序、中序、后序遍历二叉树 (递归) (3) 前序、中序、后序遍历的非递归算法 (4) 层次遍历二叉树5) 在二叉树中查找给定关键字(函数返回值为成功1,失败0) (6) 交换各结点的左右子树 (7) 求二叉树的深度 (8) 叶子结点数 (9) 删除某结点 输入格式 第一行:准备建树的结点个数n 第二行:输入n个整数,用空格分隔 第三行:输入待查找的关键字 第四行:输入待查找的关键字 第五行:输入待插入的关键字 第六行:输入待删除的关键字 输出格式 第一行:二叉树的先序遍历序列 第二行:二叉树的中序遍历序列 第三行:二叉树的后序遍历序列 第四行:查找结果 第五行:查找结果 第六行~第八行:插入新结点后的二叉树的先、中、序遍历序列 第九行:插入新结点后的二叉树的中序遍历序列(非递归算法) 第十行:插入新结点后的二叉树的层次遍历序列 第十一行:删除结点后的二叉树的中序遍历序列(非递归算法) 第十二行:删除结点后的二叉树的层次遍历序列 第十三行~第十五行:第一次交换各结点的左右子树后的先、中、后序遍历序列 第十六行~第十八行:第二次交换各结点的左右子树后的先、中、后序遍历序列 第十九行:二叉树的深度 第二十行:叶子结点数
06-06
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Shirandexiaowo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值