[LeetCode] 110. Flatten Binary Tree to Linked List

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);
        }
    }
};

参考

http://www.cnblogs.com/grandyang/p/4293853.html

猜你喜欢

转载自blog.csdn.net/Peng_maple/article/details/82287941