【二叉树】查找搜索二叉树被调换节点

知识点

搜索二叉树的父节点大于左孩子节点的值,小于右孩子节点的值。中序遍历搜索二叉树得到的序列为升序序列。

题目

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

给定一棵树的根结点,请返回两个调换了位置的值,其中小的值在前。

思路

调换位置后,中序遍历得到的序列一定不是升序序列。下面根据调换位置后二叉树的中序遍历结果得到调换位置的节点值。

如原搜索二叉树中序遍历结果为1 2 3 4 5,如果节点2和5交换,则中序遍历结果变为1 5 3 4 2。可以看到这个序列中有两次降序:第一次为5->3,第二次为4->2. 在这个例子中第一个错误节点是第一次降序中较大的节点(即5),第二个错误节点是第二次降序中较小的节点(即2)。

如果只有一次降序,如将节点3和4交换,中序遍历结果为1 2 4 3 5,可以看到序列中有一次降序4->3,则第一个错误节点是降序中较大的节点(即4),第二个错误节点是降序中较小的节点(即3)。

综合来看,第一个错误节点是第一次降序中的较大节点,第二个错误节点是最后一次降序中的较小节点。

代码实现

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNo
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值