问题描述
给定一个二叉树,原地将它展开为链表。
例如:
将其展开为:
解题思路
观察链表,可以看出是先序遍历二叉树后依次放入链表中。因此,我们明确采用深度优先搜索。
先将根结点放入 vector 中,再遍历左子树直到空结点为止,之后遍历右子树直到空结点为止。不断深搜下去可以将二叉树完全遍历。
之后就是变成链表形式,可以看出链表还是基于二叉树形式形成的,只是将每个结点的左子结点为空,右子结点是先序遍历的结果。
基于以上思路,代码就可以实现。
程序实现
/**
* 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:
vector<TreeNode*> res;
public:
void flatten(TreeNode* root) {
if (!root) return;
dfs(root);
int len = res.size();
res[0]->left = NULL;
for (int i = 0; i < len - 1; i++) {
res[i]->right = res[i+1];
res[i+1]->left = NULL;
}
}
void dfs(TreeNode* root) {
if (!root) return;
else {
res.push_back(root);
dfs(root->left);
dfs(root->right);
}
return;
}
};
@2019.05.26 北京·怀柔