一个二叉排序树的某两个节点颠倒了为了,去恢复它。
不可思议的是这道题居然被标记为了hard,其实难度远低于其他的hard或medium。
思路:中序遍历,然后看是不是递增的,如果不是,记录下来。注意,可能有一次逆序,也可能有两次,一次的发生在相邻节点。
注意,中序遍历是这样的:
void f(node * root){
if(root==NULL)
return;
f(root->left);
cout<<root->val<<endl;
f(root->right);
}
代码:
TreeNode *mistake1, *mistake2;;
TreeNode *pre;
void recursive_traversal(TreeNode*root) {
if(root==NULL) {
return;
}
recursive_traversal(root->left);
if(pre!=NULL&&root->val<pre->val) {
if(mistake1==NULL) {
mistake1 = pre;
mistake2 = root;
} else {
mistake2 = root;
}
}
pre = root;
recursive_traversal(root->right);
}
void recoverTree(TreeNode *root) {
recursive_traversal(root);
if(mistake1!=NULL&&mistake2!=NULL) {
int tmp = mistake1->val;
mistake1->val = mistake2->val;
mistake2->val = tmp;
}
}
本文介绍了一种简单的方法来修复二叉排序树中颠倒的节点,通过中序遍历检测并记录逆序节点,最终交换它们的值以恢复树的正确排序。
228

被折叠的 条评论
为什么被折叠?



