二叉树8:寻找错误结点练习题

题目:一棵二叉树原本是搜索二叉树,但是其中有两个节点调换了位置,使得这棵二叉树不再是搜索二叉树,请找到这两个错误节点并返回他们的值。保证二叉树中结点的值各不相同。给定一棵树的根结点,请返回两个调换了位置的值,其中小的值在前。

思路:对于搜索二叉树,总是与中序遍历关联起来的,根据搜索二叉树的特点,如果一棵树是搜索二叉树,那么当对其进行中序遍历时一定是顺序排列的,本题中说一棵搜索二叉树中的2个结点交换了位置,而由于已知各个结点各不相同因此显然对此时的二叉树进行中序遍历时会出现逆序的结点,即某个结点可能比前一个结点小,这种情况可能出现1次或者2次,例如12345,如果不相邻的元素24交换位置得到14325,那么显然会出现2次减小的情况,4à3和3à2;如果是相邻的2个元素23交换位置得到13245,那么只有1次减小的情况,3à2,因此按照中序遍历的顺序遍历当前的二叉树,每次记录上一个数和当前的数进行比较,如果减小了就是出错的数,记第一次出错时的较大值(当前值的前面一个值)为number1,较小值(当前值)为number2,然后继续向下遍历,如果遇到第2次出错的情况,就用较小的值(当前值)替换number2,表示这才是与number1交换的值,最后显然number1,number2就是交换的2个值,并且number1>number 2,由于要求返回时较小的值在前面,因此返回number2,number1。可以使用递归也可以不使用递归来解决问题。

总的来说第一个出错的数(大)是第一

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值