114.FlattenBinaryTreetoLinkedList

你快乐吗?

Posted by bbkgl on September 26, 2019

114. Flatten Binary Tree to Linked List


C++,数据量不大的情况下,时间没什么意义,看运气都。。。复杂度O(n),思路如下:

题目的意思是让把前序遍历的结果串成链表,要求不创建新结点,即原地串成链表。

遍历每个节点的时候,完成三个操作:

  • 将右子树入栈(全局栈)
  • 将左子树的遍历结果赋值给右子树指针
  • 返回当前节点

这时候就有个疑问,那右子树怎么办?

答:接上空结点。即碰到空结点就使用栈顶结点遍历,如果栈空则返回空结点。

代码如下:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
private:
    TreeNode *dfs(TreeNode *root, stack<TreeNode *> s) {
        if (root == nullptr) {
            if (s.empty()) return nullptr;
            TreeNode *next = s.top();
            s.pop();
            return dfs(next, s);
        }
        s.push(root->right);
        root->right = dfs(root->left, s);
        root->left = nullptr;
        return root;
    }
public:
    void flatten(TreeNode* root) {
        stack<TreeNode *> s;
        dfs(root, s);
    }
};