Leetcode, FlattenBinaryTreeToLinkedList2
#include <iostream>
#include <vector>
#include <stack>
#include <algorithm>
using namespace std;
struct TreeNode
{
int _val;
TreeNode *_left, *_right, *_next;
TreeNode(int x) : _val(x), _left(nullptr), _right(nullptr), _next(nullptr) { }
};
//递归 时间复杂度O(n),空间复杂度O(logn)
void solution(TreeNode *root)
{
if (root == nullptr) return;
TreeNode dummy(-1);
for ( TreeNode *cur = root, *prev = &dummy;
cur; cur = cur->_next)
{
if (cur->_left)
{
prev->_next = cur->_left;
prev = prev->_next;
}
if (cur->_right)
{
prev->_next = cur->_right;
prev = prev->_next;
}
}
solution(dummy._next);
}
void solution2(TreeNode *root)
{
if (root == nullptr) return;
while (root)
{
TreeNode *next = nullptr; //the first node of next level
TreeNode *prev = nullptr; //previous node on the same level
for (; root; root = root->_next)
{
if (!next)
next = root->_left ? root->_left : root->_right;
if (root->_left )
{
if (prev)
prev->_next = root->_left;
prev = root->_left;
}
if (root->_right )
{
if (prev)
prev->_next = root->_right;
prev = root->_right;
}
}
root = next; //turn to next level
}
}
int main()
{
TreeNode *node1 = new TreeNode(1);
TreeNode *node2 = new TreeNode(2);
TreeNode *node3 = new TreeNode(3);
TreeNode *node4 = new TreeNode(4);
TreeNode *node5 = new TreeNode(5);
TreeNode *node7 = new TreeNode(7);
node1->_left = node2;
node1->_right = node5;
node2->_left = node3;
node2->_right = node4;
node5->_right = node7;
solution(node1);
solution2(node1);
return 0;
}