LeetCode 114. Flatten Binary Tree to Linked List
Solution1:我的答案
前序遍历,垃圾算法,不过没想到排名还挺靠前。。。
/**
* 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;
vector<TreeNode* > result;
Preordertraversal(root, result);
int i = 0;
for (; i < result.size() - 1; i++) {
result[i]->left = NULL;
result[i]->right = result[i + 1];
}
result[i]->left = NULL; result[i]->right = NULL;
return;
}
void Preordertraversal(TreeNode* root, vector<TreeNode* >& res) {
if (!root) return;
res.push_back(root);
Preordertraversal(root->left, res);
Preordertraversal(root->right, res);
}
};
Solution2:
参考链接:http://www.cnblogs.com/grandyang/p/4293853.html
这道题要求把二叉树展开成链表,根据展开后形成的链表的顺序分析出是使用先序遍历,那么只要是树的遍历就有递归和非递归的两种方法来求解,这里我们也用两种方法来求解。首先来看递归版本的,思路是先利用DFS的思路找到最左子节点,然后回到其父节点,把其父节点和右子节点断开,将原左子结点连上父节点的右子节点上,然后再把原右子节点连到新右子节点的右子节点上,然后再回到上一父节点做相同操作。代码如下:
// Recursion
class Solution {
public:
void flatten(TreeNode *root) {
if (!root) return;
if (root->left) flatten(root->left);
if (root->right) flatten(root->right);
TreeNode *tmp = root->right; //临时保存原右子树的位置
root->right = root->left; //把原左子树连接到根结点的右子结点的位置上
root->left = NULL; //根结点的左子结点置空
while (root->right) root = root->right;//循环到右子结点的右子结点上
root->right = tmp; //把原右子树连接到新右子结点的右子结点上
}
};
对于下面这个二叉树:
Given
1
/ \
2 5
/ \ \
3 4 6
操作过程如下:
1
/ \
2 5
/ \ \
3 4 6
1
/ \
2 5
\ \
3 6
\
4
1
\
2
\
3
\
4
\
5
\
6
Other Solutions:见参考链接