一、题目介绍
给定一个二叉树,原地将它展开为一个单链表。
例如,给定二叉树
1
/ \
2 5
/ \ \
3 4 6
将其展开为:
1
\
2
\
3
\
4
\
5
\
6
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/flatten-binary-tree-to-linked-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、解题思路
本题的解题思路为,首先按照前序遍历的方式遍历一遍二叉树,将遍历的结果保存到一个链表中;其次按照链表中节点的顺序,依次将每个节点的左节点指向NULL,将其右节点指向当前链表节点的下一节点。但是,考虑到两次遍历增加复杂度的原因,因此将二叉树的前序遍历和链表展开一起完成。在前序遍历开始前先定义一个prev节点赋值为NULL,遍历过程中首先判断prev节点是否为NULL,如果不为NULL,则将其左节点置为NULL,右节点赋值为curr(当前节点);如果为NULL,则继续遍历二叉树,并将当前节点的右子节点和左子节点依次保存到一个栈结构中,然后将prev赋值为curr。按照这一规则完成整个遍历即可。
三、解题代码
class Solution {
public:
void flatten(TreeNode* root) {
if(root == NULL)
return;
stack<TreeNode*> st;
TreeNode* prev = NULL;
TreeNode* curr = NULL;
st.push(root);
while(!st.empty())
{
curr = st.top();
st.pop();
if(prev != NULL)
{
prev->left = NULL;
prev->right = curr;
}
TreeNode* left = curr->left;
TreeNode* right = curr->right;
if(right != NULL)
st.push(right);
if(left != NULL)
st.push(left);
prev = curr;
}
}
};