1,题目要求
Given a binary tree, flatten it to a linked list in-place.
给定二叉树,将其平铺到链接列表中。
2,题目思路
对于这道题,很奇怪,说是将一颗二叉树“平铺”到链表之中。
但是这棵树并不是二叉搜索树,题目给出的例子中,“链表”变为一个有序链表可能也只是纯属偶然。而且这个只是所谓的链表,实际就是讲一颗二叉树构建成只有右孩子的树形结构。
当然,树的左右孩子也是通过指针实现的,说是一个链表也不为过。
主要就在于这个平铺的概念,仔细分析之后,个人的理解是右孩子变成左孩子的孩子节点,左孩子不变,有点像数据结构中树与森林问题的孩子节点的转换——左孩子,右兄弟。
因此,对于这道题,我们的求解思路是,利用后序遍历的思想,对树进行遍历。
并将每个节点的左孩子设为空,右孩子设为遍历过程中的前一个节点,然后自己右设为“前一个节点”,以供自己的左兄弟或者父节点指向。
具体实现的难点在于prev节点的设置,对“前一个节点”的记录。
3,代码实现
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
static auto speedup = [](){
ios::sync_with_stdio(false);
cin.tie(nullptr);
return nullptr;
}();
class Solution {
public:
void flatten(TreeNode* root) {
if(root == nullptr)
return;
postHelper(root);
return;
}
void postHelper(TreeNode* node){
if(node == nullptr)
return;
postHelper(node->right);
postHelper(node->left);
node->right = prev;
node->left = nullptr;
prev = node;
}
private:
TreeNode* prev;
};