Move Zero
// 要求只交换值,0只能移到substree,交换完成后,0不能有非0的node在subtree
/*
1 1
/ \ / \
0 2 3 2
/ /\ swap之后 / / \
3 0 0 0 4 0
/\ / \
4 5 0 5
*/
#include <iostream>
#include <cassert>
using namespace std;
class TreeNode {
public:
TreeNode* left;
TreeNode* right;
int val;
TreeNode(int v) : val(v), left(nullptr), right(nullptr) {}
};
void swap(TreeNode* root) {
if (!root) return;
bool needSwap = root->val == 0;
if (root->left) {
if (needSwap) {
root->val = root->left->val;
root->left->val = 0;
needSwap = false;
}
swap(root->left);
}
if (root->right) {
if (needSwap) {
root->val = root->right->val;
root->right->val = 0;
}
swap(root->right);
}
}
TreeNode* swapZero(TreeNode* root) {
if (!root) {
return nullptr;
}
swap(root);
return root;
}
void printTree(TreeNode* root) {
if (!root) return;
printTree(root->left);
cout << root->val << " ";
printTree(root->right);
}
int main() {
TreeNode* root = new TreeNode(1);
root->left = new TreeNode(0);
root->right = new TreeNode(2);
root->left->left = new TreeNode(3);
root->right = new TreeNode(2);
root->right->left = new TreeNode(0);
root->right->right = new TreeNode(0);
root->right->left->left = new TreeNode(4);
root->right->left->right = new TreeNode(5);
printTree(root);
TreeNode* res = swapZero(root);
printTree(res);
return 0;
}```
Last updated