1、题目
将一棵二叉树按照前序遍历拆解成为一个假链表
。所谓的假链表是说,用二叉树的 right 指针,来表示链表中的 next 指针。
注意事项
不要忘记将左儿子标记为 null,否则你可能会得到空间溢出或是时间溢出。
样例
1
\
1 2
/ \ \
2 5 => 3
/ \ \ \
3 4 6 4
\
5
\
6
2、思路
先写一个按照前序遍历存放二叉树的函数save:该函数将二叉树按照前序遍历的顺序存放在向量里面;
通过调用save函数将给出的二叉树存进向量,然后将向量里的元素依次展开成链表,转化成链表的过程中记得将root->left标记为空。
3、代码
/**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param root: a TreeNode, the root of the binary tree
* @return: nothing
*/
vector<int>v;
void save(TreeNode *root)
{
if(root==NULL)
return;
else{
v.push_back(root->val);
save(root->left);
save(root->right);
}
} //用向量将前序遍历的结果存起来的函数
void flatten(TreeNode *root) {
// write your code here
save(root); //调用函数存放给定的二叉树
TreeNode *r,*temp;
temp=root; //将数组里存放的元素开始转化成链表
for(int i=1;i<v.size();i++) //从1开始循环是因为已经先把根节点赋给temp了
{
r=new TreeNode(v[i]);
temp->left=NULL;
temp->right=r;
temp=r;
}
}
};
4、感想
本来是想直接通过转化原二叉树改成指针的,写着写着把自己写晕了,也没ac,争取抽空再重新把这个写出来了!先把代码存一下
/* if(root==NULL)
return;
if(root->left==NULL)
{ flatten(root->right);
return;
}
TreeNode *l=root->left;
TreeNode *r=root->right;
flatten(l);
flatten(r);
root->left=NULL;
root->right=l;
while(l->right!=NULL)
{
l=l->right;
l->right=r;
}
——————————————————————