1. 程式人生 > >[LeetCode] 110. Flatten Binary Tree to Linked List

[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