LeetCode 114 Flatten Binary Tree to Linked List

232 阅读1分钟

LeetCode 114 Flatten Binary Tree to Linked List

思路

这题的本质是先序遍历。

解法1

使用栈实现先序遍历的同时,将各节点连接。

解法2

在先序遍历中,当前节点的前一个遍历结果是对当前节点左子树进行先序遍历的最后一个节点,也就是当前节点左子树再往右走到底。然后将当前节点的右子树接到这个先序遍历的前一个节点上,再将当前节点的变为右子树。重复该过程即可。

代码

解法1

class Solution {
public:
    void flatten(TreeNode* root) {
        if (!root) return ;
        stack<TreeNode*> stk;
        TreeNode *dummy = new TreeNode(0), *tail = dummy;
        
        stk.push(root);
        while(!stk.empty()) {
            root = stk.top();
            stk.pop();
            if (!root) continue;
            stk.push(root->right);
            stk.push(root->left);
            
            tail->right = root;
            root->left = nullptr;
            tail = tail->right;
        }
        
        root = dummy->right;
    }
};

解法2

class Solution {
public:
    void flatten(TreeNode* root) {
        TreeNode *cur = root, *right, *left;
        
        while (cur) {
            right = cur->right;
            left = cur->left;
            
            if (left) {
                while (left->right) 
                    left = left->right;
                
                left->right = right;
                cur->right = cur->left;
                cur->left = nullptr;
            }
            cur = cur->right;
        }
    }
};