给你二叉树的根结点 root ,请你将它展开为一个单链表:
展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。
展开后的单链表应该与二叉树 先序遍历 顺序相同。
示例 1:
输入:root = [1,2,5,3,4,null,6]
输出:[1,null,2,null,3,null,4,null,5,null,6]
示例 2:
输入:root = []
输出:[]
示例 3:
输入:root = [0]
输出:[0]
提示:
树中结点数在范围 [0, 2000] 内
-100 <= Node.val <= 100
Code:
class Solution {
public:
// 先序遍历
void preOrder(TreeNode *root, vector<TreeNode *> &result) {
// 若结点为空,则退出先序遍历
if (root == NULL) {
return;
}
// 若节点不为空,则存入数组
result.push_back(root);
// 前序遍历左子树
preOrder(root->left, result);
// 前序遍历右子树
preOrder(root->right, result);
}
// 二叉树展开为链表
void flatten(TreeNode *root) {
// 如果二叉树为空
if (root == NULL) {
// 则直接返回空树
return;
}
// 定义数组,记录前序遍历结果
vector<TreeNode *> Node_Temp;
// 进行前序遍历,并将结果存入数组
preOrder(root, Node_Temp);
// 遍历结果数组,将二叉树展开为链表
for (int i = 0; i < Node_Temp.size() - 1; i++) {
// 将当前结点的左孩子置为空
Node_Temp[i]->left = NULL;
// 当前结点的右孩子为数组中的下一个元素
Node_Temp[i]->right = Node_Temp[i + 1];
}
}
};
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/flatten-binary-tree-to-linked-list