LeetCode 114——二叉树展开为链表

一、题目介绍

给定一个二叉树,原地将它展开为一个单链表。

例如,给定二叉树

    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;
        }
    }
};

四、解题结果

猜你喜欢

转载自blog.csdn.net/qq_39661206/article/details/113105277