题目描述
给定一个二叉树,原地将它展开为链表。
例如,给定二叉树
1
/ \
2 5
/ \ \
3 4 6
将其展开为:
1
\
2
\
3
\
4
\
5
\
6
思路
注意题目要求是单向链表,需要将所有的left
指针置为null。
1 非递归
非递归先序遍历,不断修改right
指针指向
class Solution {
public:
void flatten(TreeNode* root) {
if(!root) return;
stack<TreeNode*> s;
s.push(root);
while (!s.empty()){
TreeNode *node = s.top();
s.pop();
if(node->right) s.push(node->right);
if(node->left) s.push(node->left);
node->left = nullptr;
node->right = s.empty()? nullptr: s.top();
}
}
};
2 递归
在还没操作节点右子树前,不能破坏该节点的右子树指向。所以采用后序遍历。
递归的后序遍历变种(右节点->左节点->根节点),从链表尾节点往前不断回溯,并用一个全部变量指针prev
存储链表中的下一个节点,直到返回根节点。
class Solution {
private:
TreeNode *pre = nullptr;
public:
void flatten(TreeNode* root) {
if(!root) return;
flatten(root->right);
flatten(root->left);
root->right = pre;
root->left = nullptr;
pre = root;
}
};