leetcode 114. 二叉树展开为链表 medium
题目描述:
给定一个二叉树,原地将它展开为链表。
例如,给定二叉树
1
/ \
2 5
/ \ \
3 4 6
将其展开为:
1
\
2
\
3
\
4
\
5
\
6
就是让root的right指向下一个节点
解题思路:
这道题要求把二叉树展开成链表,根据展开后形成的链表的顺序分析出是使用先序遍历,那么只要是数的遍历就有递归和非递归的两种方法来求解。
另一种解法: nb的解法,真正理解了这道题的解法!(leetcode 讨论还是得看英文区啊,确实顶)
//因为题目给的链表从上往下看是先序遍历的:根左右, 而从下往上看是:右左根
//所以我们倒着来 先flatten(right) 再flatten(left) 再搞定root!
代码:
// 递归
class Solution {
public:
void flatten(TreeNode* root) {
if(!root)
return;
flatten(root->left);
flatten(root->right);
TreeNode* cur=root->left;
if(cur){
while(cur->right)
cur=cur->right;
cur->right=root->right;
root->right=root->left;
root->left=nullptr;
}
return;
}
};
// 非递归
// Non-recursion
class Solution {
public:
void flatten(TreeNode *root) {
TreeNode *cur = root;
while (cur) {
if (cur->left) {
TreeNode *p = cur->left;
while (p->right) p = p->right;
p->right = cur->right;
cur->right = cur->left;
cur->left = NULL;
}
cur = cur->right;
}
}
};
class Solution {
public:
void flatten(TreeNode* root) {
flatten(root,nullptr);
}
// pre是上次搞完了的头节点
//因为题目给的链表从上往下看是先序遍历的:根左右, 而从下往上看是:右左根
//所以我们倒着来 先flatten(right) 再flatten(left) 再搞定root!
TreeNode* flatten(TreeNode* root, TreeNode *pre){
if(root==nullptr)
return pre;
pre=flatten(root->right,pre);
pre=flatten(root->left,pre);
root->right=pre;
root->left=nullptr;
pre=root;
return pre;
}
};