Question:
Given a binary tree, flatten it to a linked list in-place.
For example,
Given
1 / \ 2 5 / \ \ 3 4 6
The flattened tree shoshould look like:
1 \ 2 \ 3 \ 4 \ 5 \ 6
Click to show hints.
An1_1:
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: void flatten(TreeNode *root) { // Start typing your C/C++ solution below // DO NOT write int main() function if (root == NULL) return; TreeNode* left = root->left; TreeNode* right = root->right; // the original right child if (left) { root->right = left; root->left = NULL; TreeNode* rightmost = left; while(rightmost->right) { rightmost = rightmost->right; } rightmost->right = right; // point to the original right child } flatten(root->right); }};
An1_2:
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: void flatten(TreeNode *root) { // Start typing your C/C++ solution below // DO NOT write int main() function if (root == NULL) return; if (root->left) flatten(root->left); if (root->right) flatten(root->right); if (NULL == root->left) return; TreeNode ** ptn = &(root->left->right); while (*ptn) { ptn = & ((*ptn)->right); } *ptn = root->right; root->right = root->left; // link right to left root->left = NULL; }};
An1_3:
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: void flatten(TreeNode *root) { // Start typing your C/C++ solution below // DO NOT write int main() function bool flag = true; stack<TreeNode *> t; TreeNode *pre = NULL; if(root) { t.push(root); } while(t.size()) { TreeNode *cur = t.top(); if(flag) { if(cur->left && cur->left != pre) { t.push(cur->left); } else { flag = false; } } else { if(cur->right && cur->right != pre) { t.push(cur->right); flag = true; } else { t.pop(); //at this time, the sub-tree of cur is flattened, so just flatten the cur TreeNode *left = cur->left; if(left) { TreeNode *lastLeft = left; while(lastLeft->right) { lastLeft = lastLeft->right; } lastLeft->right = cur->right; cur->right = left; cur->left = NULL; } } } pre = cur; } }};
Reference recommendations:
Leetcode problem: flatten binary tree to linked list