Leetcode114、二叉树转链表

1、问题

给定一个二叉树,将该二叉树就地(in-place)转换为单链表。单链表中节点顺序为二叉树前序遍历顺序。

2、思路

3、代码

#include 

struct TreeNode
{
    // 多个成员
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode ( int x ) : val(x), left(nullptr), right(nullptr) {}
};

using namespace std;

class Solution
{
public:
    void flatten( TreeNode* root)
    {
        TreeNode* last = nullptr;  // 指向空指针
        preorder( root, last );
    }
private:
    void preorder( TreeNode* node, TreeNode* &last)
    {
        // 处理当前节点node,并将以当前节点为根节点的子树
        // 拉直成链表,更新last的值

        // 边界条件
        if ( !node )
            return;

        // 当前节点为叶节点
        if ( !node->left && !node->right )
        {
            last = node;
            return;
        }

        // 如果当前节点不是叶节点,
        // 则当前节点要么node->left != nullptr
        // 要么node->right != nullptr
        // 要么node->left != nullptr && node->right != nullptr
        // 即至少有一个子树

        // 将当前节点的左节点和右节点的地址存储起来
        TreeNode* left = node->left;
        TreeNode* right = node->right;
        TreeNode* left_last = nullptr;
        TreeNode* right_last = nullptr;

        if ( left )  // 左子树存在
        {
            // 将左子树拉直
            preorder( left, left_last );  // left 指针对应 left_last
            node->left = nullptr;
            node->right = left;
            last = left_last;  // 如果只有左子树的话,那么last就是left_last
        }
        if ( right )
        {
            // 将右子树拉直
            preorder( right, right_last );
            if ( left_last )
                left_last->right = right;  // left_last是叶节点
            last = right_last;
        }
    }
};

int main()
{
    TreeNode a(1);
    TreeNode b(2);
    TreeNode c(3);
    TreeNode d(4);
    TreeNode e(5);
    TreeNode f(6);

    a.left = &b;
    a.right = &e;
    b.left = &c;
    b.right = &d;
    e.right = &f;

    Solution S;
    S.flatten(&a);

    TreeNode* head = &a;
    while ( head )
    {
        if ( head ->left )
            cout << "Error!" << endl;
        cout << head->val << endl;
        head = head->right;
    }
    return 0;
}

你可能感兴趣的:(Leetcode114、二叉树转链表)