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.
Subscribe to see which companies asked this question
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
/*
这道题有一个巧妙得地方,先序遍历是本节点,左子树,右子树, 但是这样做需要找到当前节点的后续节点
如果能找到当前节点在遍历中的前驱节点,思路就会更清晰;而且如果我们用先序遍历的话,在遍历当中就会改变当前节点的right指针
所以当真正到当前节点的右子树的时候,右指针已经不是指向右孩子了
解决的方法是,把先序遍历反一下,即,右子树,左子树,本届点,这样就能在遍历中很容易得到后续节点,并且在处理当前节点的时候
它的左子树,右子树都已经处理好,直接把右指针指向后续节点就可以了
*/
class Solution {
private:
void flatternHelper(TreeNode* curNode, TreeNode* &nextNode) {
if (!curNode)
return;
flatternHelper(curNode->right, nextNode);
flatternHelper(curNode->left, nextNode);
curNode->left = NULL;
curNode->right = nextNode;
nextNode = curNode;
}
public:
void flatten(TreeNode* root) {
if (!root)
return;
TreeNode *nextNode = NULL;
flatternHelper(root, nextNode);
}
};