题目
如题
分析
一.递归
其实仔细观察例子是一个先序遍历。先遍历到左子树最后一个节点,然后将左子树放到右子树位置,同时左子树置null
将原来右子树放到左子树的的最右节点。然后一层一层往上重复,到了根节点就完成了。
二.非递归
非递归其实是从上往下展开。将从根节点开始判断,如果根节点的左子树不为空,则将左子树移到右子树的位置,同
时根节点的左子树置null。然后将右子树放到左子树的右节点,然后再判断当前节点的左子树,重复上述操作。
解法1:递归
void flatten(TreeNode* root) {
if (root == nullptr){
return;
}
if (root->left){
flatten(root->left);
}
if (root->right){
flatten(root->right);
}
TreeNode* tmp = root->right;
root->right = root->left;
root->left = nullptr;
while (root->right){
root = root->right;
}
root->right = tmp;
}
解法2:非递归
void flatten1(TreeNode* root) {
while (root)
{
if (root->left)
{
TreeNode* tmp = root->right;
root->right = root->left;
root->left = nullptr;
TreeNode* curNode = root->right;
while (curNode->right){
curNode = curNode->right;
}
curNode->right = tmp;
}
root = root->right;
}
}