给定一个二叉树,原地将它展开为链表。
例如,给定二叉树
将其展开为:
这里提供两种解法,推荐第二种:
/**
* 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(NULL == root) return;
vector<int> vecRes;
stack<TreeNode *> sta;
TreeNode *tempRoot = root;
while(tempRoot || !sta.empty())
{
if(tempRoot)
{
sta.push(tempRoot);
vecRes.push_back(tempRoot->val);
tempRoot = tempRoot->left;
}
else
{
TreeNode *pNode = sta.top();
sta.pop();
tempRoot = pNode->right;
}
}
if(vecRes.size() == 1) return;
TreeNode *pRoot = new TreeNode (vecRes[1]);
TreeNode *pRight = pRoot;
for(int i = 2; i < vecRes.size(); i++)
{
pRoot->right = new TreeNode (vecRes[i]);
pRoot = pRoot->right;
}
root->left = NULL;
root->right = pRight;
}
};
前序遍历将二叉树放到vector里面,重新构造二叉树
class Solution {
public:
void flatten(TreeNode* root) {
if(NULL == root) return;
if(root->left) flatten(root->left);
if(root->right) flatten(root->right);
TreeNode *pTemp = root->right;
root->right = root->left;
root->left = NULL;
while(root->right)
{
root = root->right;
}
root->right = pTemp;
}
};
借鉴他人的参考答案,采用后序遍历的方式:
1.先将右子树的值赋值给一个临时变量temp
2.再将左子树的值赋值给右子树
3.遍历右子树,找到最后一个右子树, 再将temp赋值给该右子树