【数据结构与算法】关于二叉查找树的思考

一定要抓住二叉查找树的中序遍历结果是一个升序数组的特性!

对二叉查找树进行中序遍历的结果,就是一个升序的数组,因此很多问题,我们都可以先转到一个升序的数组去考虑,而后对二叉查找树进行中序遍历按,就可以得到同样的结果。
如题目

这里写图片描述
关键就是要找到二叉查找树中位置交换的两个节点。但是如何找到这两个节点呢?
我们可以考虑一个升序的数组,在一个升序的数组中如何找到两个位置交换的节点呢?
例如对于数组:1,2,7,4,5,6,3,8,9.不难发现,新的数组存在两对逆序并相邻的数字,即7,4和6,3,造成这出现的原因,就是发生了一次交换,一定是较小的书换到了较大的数的位置,较大的数换到了较小的数的位置。所以在这两对中,我们可以简单的判断出:是前一对较大的数和后一对较小的数发生了交换。
当然也有只存在一对逆序的情况,例如1,2,4,3,5,6、是因为交换的两个数本身是相邻的。
因此,当我们对二叉查找树进行中序遍历,并在这过程中,找到两对或者一对逆序,而后进行交换即可。参考代码如下:

这里写图片描述
更简单的做法:
只保存需要交换位置的两个对象,以及前一个对象(用作判断)。参考代码如下:(9ms,采用栈来模拟中序遍历)
这里写图片描述

如果用递归会不会速度有所提高?代码如下(4ms)
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值