题目:
将一棵二叉树按照前序遍历拆解成为一个假链表
。所谓的假链表是说,用二叉树的 right 指针,来表示链表中的 next 指针。
注意事项
不要忘记将左儿子标记为 null,否则你可能会得到空间溢出或是时间溢出。
1
\
1 2
/ \ \
2 5 => 3
/ \ \ \
3 4 6 4
\
5
\
6
如果root==null,直接返回,然后判断对左子树递归,再判断右子树是否为空,为空的话,直接将左子树赋值过来,否则对右子树递归,还要找到左子树最后一个值,插入到其中。
代码:
/**
* 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
*/
void flatten(TreeNode *root) {
// write your code here
/*vector<int>ss;
TreeNode *s[100];
int top=-1;
while(root!=NULL||top!=-1)
{
while(root!=NULL)
{
//cout<<root->val;
ss.push_back(root->val);
s[++top]=root;
root=root->left;
}
if(top!=-1)
{ root=s[top--];
root=root->right;
}
}
//return ss;
for(int i=0;i<=ss.size()-1;i++)
{ root=s[i];
root->left=NULL;
root=root->right;
}*/
if(root==NULL) return;//为什么啊!!!!!
else
{
if(root->left!=NULL)
{ TreeNode *R=root->right;
TreeNode *T=root->left;
flatten(T);
//TreeNode *T=root->right;
if(R==NULL)
{ root->right=T;
//else flatten(root->right);
//root->right->right=T;
root->left=NULL;
//return;
}
else { flatten(R);
//TreeNode *T=root->right;
/*while(T->right!=NULL)
{T=T->right;}
T->right=root->left;*/
//TreeNode *R=root->left;
root->right=T;
root->left==NULL;
//TreeNode *R=root->right;
while(T->right!=NULL)
{T=T->right;}
T->right=R;
//R->left=NULL;
//return;
}
}
/*if(root->right!=NULL)
{ flat*/
else {flatten(root->right); return;}
}
/*if(root==NULL) return;
if(root->left==NULL)
{flatten(root->right);return;}
TreeNode *T=root->left;
TreeNode *R=root->right;
flatten(T);
flatten(R);
root->left=NULL;
root->right=T;
while(T->right!=NULL)
{T=T->right;}
T->right=R;*/
}
};
感想:这道题真的让我抓狂,我一开始想用遍历,结果做不出来,然后想这个递归,可结果总是不对!,数据到了后面总是出现重复,且重复的数量呈现递增,我看了别人的博客,发现思路是一样的,后来我在第二天改了一个地方,终于过了。