Leetcode#99 Recover Binary Search Tree

原题地址

 

中序遍历二叉搜索树,正常情况下所有元素都应该按递增排列,如果有元素被交换,则会出现前面元素大于后面的情况,称作反序。由于交换了两个节点,所以通常会有两处反序,但如果是两个相邻节点发生了交换,则只会有一次反序。

注意,如果有两次反序,前面那次一定是较大数,后面那次一定是较小数

交换的时候注意只需要交换value就行了,别傻不啦叽的去交换节点。

 

代码:

 1 vector<pair<TreeNode *, TreeNode *> > nodes;
 2 TreeNode *prev;
 3     
 4 void inorderTraverse(TreeNode *curr) {
 5   if (!curr)
 6     return;
 7   inorderTraverse(curr->left);
 8   if (prev && prev->val > curr->val)
 9     nodes.push_back(pair<TreeNode *, TreeNode *>(prev, curr));
10   prev = curr;
11   inorderTraverse(curr->right);
12 }
13 
14 void recoverTree(TreeNode *root) {
15   inorderTraverse(root);
16   if (nodes.size() == 1) {
17     int tmp = nodes[0].first->val;
18     nodes[0].first->val = nodes[0].second->val;
19     nodes[0].second->val = tmp;
20   }
21   if (nodes.size() == 2) {
22     int tmp = nodes[0].first->val;
23     nodes[0].first->val = nodes[1].second->val;
24     nodes[1].second->val = tmp;
25   }
26 }

 

转载于:https://www.cnblogs.com/boring09/p/4238991.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值