[Lc]114二叉树展开为链表
Contents
题目
题解
二叉树结构如下:
//Definition for a binary tree node.
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
1. 先序递归法
//本题的顺序可以看出是先序遍历。
class Solution {//两种方法。1、递归法。
public:
void flatten(TreeNode* root) {
if(!root) return;//若不存在该节点,直接返回
if(!root->left && !root->right) return;//若为叶节点,直接返回
if(root->left) flatten(root->left);
if(root->right) flatten(root->right);//递归先序遍历
auto tmp = root->right;//暂存该节点
root->right = root->left;//将右子树指向其左子树
root->left = nullptr;//左子树置空
while(root->right) root = root->right;//然后找到新右子树的最右的节点
root->right = tmp;//将最右节点接上暂存的原右子树
return;
}
};
1
/ \
2 5
/ \ \
3 4 6
1
/ \
2 5
\ \
3 6
\
4
1
\
2
\
3
\
4
\
5
\
6
2. 非迭代法
//本题的顺序可以看出是先序遍历。
class Solution {//两种方法。2、非迭代法
public:
void flatten(TreeNode* root) {
auto cur = root;//设置根节点为当前节点
while(cur){//若该节点存在就继续遍历
if(cur->left){//若左子树存在
auto tmp = cur->left;//暂存左子树
while(tmp->right) tmp = tmp->right;//找到左子树的最右节点
tmp->right = cur->right;//接上原右子树
cur->right = cur->left;//在该节点的右子树加上原左子树
cur->left = nullptr;//左子树置空
}
cur = cur->right;//继续遍历右子树
}
}
};
1
/ \
2 5
/ \ \
3 4 6
1
\
2
/ \
3 4
\
5
\
6
1
\
2
\
3
\
4
\
5
\
6
还有应用后序遍历的思想和先序遍历的思想的解法,但是不好理解,先不写了,后续有需要去看题解。
Author ChrisHRZ
LastMod 2020-04-07