题目链接:Flatten Binary Tree to Linked List
Given a binary tree, flatten it to a linked list in-place.
For example,
Given
1
/ \
2 5
/ \ \
3 4 6
The flattened tree should look like:
1
\
2
\
3
\
4
\
5
\
6
Hints:
If you notice carefully in the flattened tree, each node’s right child points to the next node of a pre-order traversal.
这道题的要求是将二叉树转化成链表。可以注意到,每个节点的right就是指向前序遍历的下一节点。
这道题就是要求前序遍历,然后将每个节点的right指针指向下一节点即可。用栈记录每个节点的右子树,如果左子树不为NULL,者将其复制给right指针,同时将left置NULL;如果左子树为空,则需要从栈顶取元素,并赋值给right指针即可。
时间复杂度:O(n)
空间复杂度:O(n)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Solution
{
public:
void flatten(TreeNode *root)
{
TreeNode *p = root;
stack<TreeNode *> s;
while(p != NULL)
{
if(p -> right != NULL)
s.push(p -> right);
if(p -> left != NULL)
{
p -> right = p -> left;
p -> left = NULL;
}
else if(!s.empty())
{
p -> right = s.top();
s.pop();
}
p = p -> right;
}
}
};