题目:
分析:
**起初天真的以为,只要是拉长就可以啦,随便拉,但是原来只能先序。
**
随便拉:有点复杂。
先不断找右子树,在此过程中,把左子树的结点加入栈中,记录最右下方的那个结点是什么,然后将栈内的元素拉直后加到最后,栈内元素也需要经过这样的步骤拉直。
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
TreeNode* f(TreeNode* root,TreeNode* head)
{//返回最右下方的结点。
stack<TreeNode*> s;
head->right=root;
head->left=NULL;
while(root->right!=NULL)
{
if(root->left!=NULL) s.push(root->left);
root->left=NULL;
root=root->right;
}
if(root->left!=NULL) s.push(root->left);
while(!s.empty())
{
root=f(s.top(),root);
s.pop();
}
return root;
}
void flatten(TreeNode* root) {
TreeNode* head=new TreeNode();
f(root,head);
root=head->right;
}
};
先序遍历拉直。哦,那么自己的方法就太复杂了吧。
感觉自己写的代码质量挺低的,也就是巧合能过吧!
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
TreeNode* f(TreeNode* head,TreeNode* root)
{
//head->left=NULL;
head->left=root;
TreeNode* root2=root;
if(root->left!=NULL)
{
root=f(root,root->left);
}
if(root2->right!=NULL)
{
root=f(root,root2->right);
}
return root;
}
void flatten(TreeNode* root) {
TreeNode* head=new TreeNode();
if(root==NULL) return ;
f(head,root);
while(head->left!=NULL)
{
head->right=head->left;
head->left=NULL;
head=head->right;
}
root=head->right;
}
};