您的位置:首页 > 其它

lintcode--二叉搜索树交换节点(leetcode--Recover Binary Search Tree)

2017-12-17 23:51 447 查看
题目描述:

在一棵二叉搜索树中, 只有两个节点是被交换的. 找到这些节点并交换, 如果没有节点被交换就返回原来的树的根节点.

样例:

给一棵BST:



返回



思路讲解:

这道题我的一开始思路是通过先序遍历得到一个数组,然后将数组重新排序好,然后再重新赋值给原二叉树。后面发现实现不了。(个人太菜了)

然后发现另外一种别的方法,如对于数组1,2,7,4,5,6,3,8,9,如何判断是哪两个元素发生了交换呢?

不难发现,新的数组中存在两对逆序并相邻的数字,即7,4和6,3,造成这出现的原因,正是发生了一次交换,由于一定是较小的数换到了较大数的位置(向后),较大的数换到了较小数的位置(向前)。所以在这两对中,我们可以简单的判断出:是前一对的较大数和后一对的较小数发生了交换。

现在我们只需要将这两个节点找出来即可,重点是对上一层节点的存储。

具体代码:

class Solution {
public:
/*
* @param : the given tree
* @return: the tree after swapping
*/
TreeNode * first;
TreeNode * second;
TreeNode * pre;
TreeNode * bstSwappedNode(TreeNode * root) {
// write your code here
if(root==NULL){
return NULL;
}
TreeNode *head=root;
first=NULL;
second=NULL;
pre=NULL;

changenode(head);

if(first!=NULL&&second!=NULL){
int tmp=first->val;
first->val=second->val;
second->val=tmp;
}

return root;
}
void changenode(TreeNode * root)
{
if(root->left!=NULL)changenode(root->left);

if(pre!=NULL&&pre->val>root->val){
if(first==NULL){
first=pre;
}
if(first!=NULL){
second=root;
}
}
pre=root;
if(root->right!=NULL)changenode(root->right);
}
void printvector(vector<int>res)
{
for(int i=0;i<res.size();i++)
{
cout<<res[i]<<" ";
}
cout<<endl;
}
};


参考博客:https://www.tianmaying.com/tutorial/LC99
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: