Flatten Binary Tree to Linked List
Given a binary tree, flatten it to a linked list in-place.
For example, given the following tree:
解析
把二叉树展开成链表,根据展开后形成的链表的顺序分析出是先序遍历。
解法1
从根节点出发,先检测其左子结点是否存在,如存在则将根节点和其右子节点断开,将左子结点及其后面所有结构一起连到原右子节点的位置,把原右子节点连到元左子结点最后面的右子节点之后。例如:
class Solution {
public:
void flatten(TreeNode* root) {
while (root) {
if (root->left && root->right) {
TreeNode *t = root->left;
while (t->right) {
t = t->right;
}
t->right = root->right;
}
if (root->left) root->right = root->left;
root->left = NULL;
root = root->right;
}
}
};
解法2:递归
分别对左右子树进行flatten,然后把左子树插到右子树与根的中间。
class Solution {
public:
void flatten(TreeNode* root) {
if(!root) return;
flatten(root->left);
flatten(root->right);
TreeNode* tmp = root->right;
root->right = root->left;
root->left = NULL;
while (root->right) root = root->right;
root->right = tmp;
}
};
解法3:前序迭代
利用stack进行前序遍历迭代。
class Solution {
public:
void flatten(TreeNode* root) {
if (!root) return;
stack<TreeNode*> s;
s.push(root);
while (!s.empty()) {
TreeNode *t = s.top(); s.pop();
if (t->left) {
TreeNode *r = t->left;
while (r->right) r = r->right;
r->right = t->right;
t->right = t->left;
t->left = NULL;
}
if (t->right) s.push(t->right);
}
}
};