* | |
* 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. | |
* | |
**********************************************************************************/ | |
/** | |
* Definition for binary tree | |
* struct TreeNode { | |
* int val; | |
* TreeNode *left; | |
* TreeNode *right; | |
* TreeNode(int x) : val(x), left(NULL), right(NULL) {} | |
* }; | |
新生成的List的每个节点的右子树指向的是 先序遍历中该节点的下一个节点。那么本题其实就是考察先序遍历。
class Solution {
public:
void flatten(TreeNode *root) {
vector<TreeNode*> v, stack;
stack.push_back(root);
while(stack.size()>0){
TreeNode* node = stack.back();
stack.pop_back();
v.push_back(node);
if (node && node->right){
stack.push_back(node->right);//先入栈右子树,后出栈右子树
}
if (node && node->left){
stack.push_back(node->left);//后入栈左子树,先出栈左子树
}
}
v.push_back(NULL);
for(int i=0; i<v.size(); i++){//按照先序遍历的顺序将节点链接起来
if (v[i]){
v[i]->left = NULL;
v[i]->right = v[i+1];
}
}
}
};