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,造成这出现的原因,正是发生了一次交换,由于一定是较小的数换到了较大数的位置(向后),较大的数换到了较小数的位置(向前)。所以在这两对中,我们可以简单的判断出:是前一对的较大数和后一对的较小数发生了交换。
现在我们只需要将这两个节点找出来即可,重点是对上一层节点的存储。
具体代码:
参考博客:https://www.tianmaying.com/tutorial/LC99
在一棵二叉搜索树中, 只有两个节点是被交换的. 找到这些节点并交换, 如果没有节点被交换就返回原来的树的根节点.
样例:
给一棵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
相关文章推荐
- 二叉树系列 - 二叉搜索树 - [LeetCode] 中序遍历中利用 pre节点避免额外空间。题:Recover Binary Search Tree,Validate Binary Search Tree
- LeetCode Recover Binary Search Tree——二查搜索树中两个节点错误
- leetcode 235 Lowest Common Ancestor of a Binary Search Tree 二叉搜索树的最小共同父节点
- leetcode:Recover Binary Search Tree (修正二叉查找树错误节点,不改变结构)【面试算法题】
- LeetCode OJ:Recover Binary Search Tree(恢复二叉搜索树)
- [Leetcode] Recover binary search tree 恢复二叉搜索树
- [LeetCode] Lowest Common Ancestor of a Binary Search Tree 二叉搜索树的最小共同父节点
- [LeetCode] Recover Binary Search Tree 复原二叉搜索树
- LeetCode | Recover Binary Search Tree(恢复二叉搜索树)
- Recover Binary Search Tree:使用常数空间复原二叉搜索树
- LeetCode刷题笔录Recover Binary Search Tree
- LeetCode Recover Binary Search Tree
- 【LeetCode笔记】Convert Sorted Array to Binary Search Tree 通过有序数列建立二叉搜索树
- Leetcode---Recover Binary Search Tree
- LeetCode: Recover Binary Search Tree
- leetcode 235. Lowest Common Ancestor of a Binary Search Tree(二叉搜索树的最小公共祖先)
- ***(leetcode) Recover Binary Search Tree
- LeetCode | Recover Binary Search Tree
- leetcode || 99、Recover Binary Search Tree
- LeetCode | Recover Binary Search Tree