将二叉树拆成链表

来源:互联网 发布:网络经济学ppt 编辑:程序博客网 时间:2024/06/15 08:34

将一棵二叉树按照前序遍历拆解成为一个假链表。所谓的假链表是说,用二叉树的 right 指针,来表示链表中的 next 指针。

 注意事项

不要忘记将左儿子标记为 null,否则你可能会得到空间溢出或是时间溢出。

样例
              1               \     1          2    / \          \   2   5    =>    3  / \   \          \ 3   4   6          4                     \                      5                       \                        6
/** * Definition of TreeNode: * class TreeNode { * public: *     int val; *     TreeNode *left, *right; *     TreeNode(int val) { *         this->val = val; *         this->left = this->right = NULL; *     } * } */class Solution {public:    /*     * @param root: a TreeNode, the root of the binary tree     * @return:      */    void flatten(TreeNode * root) {        // write your code here        if(root == NULL)//root为空直接返回        {            return ;        }       else if(root->left == NULL &&root->right == NULL)//root左右节点为空,直接返回        {            return ;        }        else if(root->left != NULL && root->right == NULL)//左节点不为空,右节点为空        {            root->right = root->left;//根节点的右节点指向原来的左节点            root->left = NULL;//根节点原来节点置为NULL            flatten(root->right);//对右节点重新调整        }        else if(root->left == NULL && root->right != NULL)//左节点为空,右节点不为空        {            flatten(root->right);//直接对右节点调整        }        else//左右节点都不为空,对左节点调整后,找到左节点调整后的首端和尾端,首端连接根节点的右节点,尾端连接根节点原来的右节点,在对原                 //来右节点调整        {            flatten(root->left);//对左节点调整            TreeNode *temp1 = root->left;//用来存左节点调整后的尾端            while(temp1->right != NULL)//找尾端            {                temp1 = temp1->right;            }            temp1->right = root->right;//尾端的右节点连接原来根节点的右节点            root->right = root->left;//根节点的右节点连接调整左节点的首端及原左节点            root->left = NULL;//跟节点的左节点置为空            flatten(temp1->right);//对跟节点的原右节点调整        }    }};