- 按照先序遍历展开
- 展开后仍然为TreeNode,只是左孩子指针一律置空
关键在于这个先序的访问过程与各个节点指针的修改操作如何统一不冲突
首先就可以排除先序遍历,瞄一眼评论其实是可以先遍历右边,从后往前构造的(我也有点这想法,之前反转链表就有这种从后往前的递归思路,只是不太好想)
public:
// 使用一个指针保存了最后一个节点
TreeNode* lastNode = nullptr;
void flatten(TreeNode* root) {
if (!root) return;
flatten(root->right);
flatten(root->left);
root->right = lastNode;
root->left = nullptr;
lastNode = root;
}
起码看起来非常优雅简洁,使用了额外的指针保存上一个(最后操作)节点,配合右左根的遍历方式,实现从后往前拼接链表
但是遗憾的是这不是一个原地算法
原地怎么做呢?前面说了,先序肯定是不行的,那就考虑后序
标签:力扣,遍历,链表,二叉树,flatten,指针,root,先序 From: https://www.cnblogs.com/yaocy/p/16979051.html