LeetCode 热题 HOT 100之二叉树展开为链表
题目114:给你二叉树的根结点 root ,请你将它展开为一个单链表:
展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。展开后的单链表应该与二叉树 先序遍历 顺序相同。
方案:先得到二叉树的前序遍历,将前序遍历结果存入到一个数组中,再对二叉树进行修改。得到前序遍历的方法包括深度优先搜索(dfs)和广度优先搜索(bfs)。
深度优先:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
void dfs(TreeNode* root, vector<TreeNode*> &v){
if(root==nullptr)return;
v.push_back(root);
dfs(root->left,v);
dfs(root->right,v);
}
void flatten(TreeNode* root) {
TreeNode* node=root;
vector<TreeNode*>v;
dfs(root,v);
int size=v.size();
for(int i=1;i<size;i++){
TreeNode* pre=v.at(i-1),*curr=v.at(i);
pre->left=nullptr;
pre->right=curr;
}
}
};
广度优先:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
void flatten(TreeNode* root) {
stack<TreeNode*>stk;
TreeNode* node=root;
vector<TreeNode*>v;
while(node!=nullptr || !stk.empty()){
if(node!=nullptr){
v.push_back(node);
stk.push(node);
node=node->left;
}
else{
node=stk.top();
stk.pop();
node=node->right;
}
}
int size=v.size();
for(int i=1;i<size;i++){
TreeNode* pre=v.at(i-1),*curr=v.at(i);
pre->left=nullptr;
pre->right=curr;
}
}
};
来源:力扣(LeetCode)
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。