题目:
Given a binary tree, flatten it to a linked list in-place.
For example, given the following tree:
1 / \ 2 5 / \ \ 3 4 6
The flattened tree should look like:
1 \ 2 \ 3 \ 4 \ 5 \ 6
题意:
将二叉树“铺平”转换为只有右子树的形式。刚开始的第一个想法是深搜,通过改变树的结构实现,但是子树转换的操作以及遍历的方法比较复杂。于是转换思维,输出的子树结构实质上是将二叉树中左右遍历之后统一转换为右子树的形式,所以先遍历一遍二叉树,然后统一进行形式转换即可实现。
代码:
void backtrack(TreeNode* root, vector<TreeNode*>& nodes) {
if(root == NULL)
return;
nodes.push_back(root);
backtrack(root->left, nodes);
backtrack(root->right, nodes);
return;
}
void flatten(TreeNode* root) {
if(root == NULL)
return;
vector<TreeNode*> nodes;
backtrack(root, nodes);
root->left = root->right = NULL;
TreeNode* cur = root;
for(int i = 1; i<nodes.size(); i++)
{
cur->right = nodes[i];
cur = cur->right;
cur->left = cur->right = NULL;
}
return;
}
注意处理root为空的情况,就AC啦~看了一些解答,发现也有直接通过深搜即可进行二叉树转换的实现。代码如下:
void flatten(TreeNode* root) {
TreeNode* prev = nullptr;
helper(root, prev);
return;
}
void helper(TreeNode* root, TreeNode*& prev){
if(root)
{
//save root->left and root->right because they are modified before traversed
TreeNode* tleft = root->left;
TreeNode* tright = root->right;
if (prev!=nullptr)
{
prev->left = nullptr;
prev->right = root;
}
prev = root;
helper(tleft, prev);
helper(tright, prev);
}
return;
}
这样实现更直观方便一些,并且节约了额外的空间。