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(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
void flatten(TreeNode* root) {
if (!root) return ;
stack<TreeNode *> s;
dfs_left(root, s);
change(root);
}
void change(TreeNode *root) {
if (!root) return ;
root->right = root->left;
root->left = NULL;
change(root->right);
}
void dfs_left(TreeNode *root, stack<TreeNode *> &s) {
if (!root) return ;
if (root->right) {
s.push(root->right);
root->right = NULL;
}
if (!root->left && s.empty()) return ;
else if (!root->left && !s.empty()) {
root->left = s.top();
s.pop();
}
dfs_left(root->left, s);
}
};