leetcode Flatten Binary Tree to Linked List C++题解

来源:互联网 发布:淘宝详情页的图片大小 编辑:程序博客网 时间:2024/06/09 02:25

做这道题的时候看到一个很好看的解法,理解了之后确实觉得很简洁且可读性也不错。基本的思路就是循环去调整每个节点的左儿子指针和右儿子指针,右指针相当于调整后的链表中的每个节点next指针,左指针置为空。注意一点,迭代到一个节点时,它的右儿子的在最后链表中的前一个节点是它兄弟节点最右边的子孙节点。需要将这个节点的right指针指向该右儿子

具体的分析如下:
Hints:
If you notice carefully in the flattened tree, each node’s right child points to the next node of a pre-order traversal.

Analysis:

Note that the problem requires in-place operation.The flatten procedure is like: cut the left child and set to right, the right child is then linked to somewhere behind the left child. Where should it be then? Actually the right child should be linked to the most-right node of the left node. So the algorithm is as follows:
(1) store the right child (we call R)
(2) find the right-most node of left child
(3) set R as the right-most node’s right child.
(4) set left child as the right child
(5) set the left child NULL
(6) set current node to current node’s right child.
(7) iterate these steps until all node are flattened.

This seems simple and elegent.

/** * Definition for a binary tree node. * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public:    void flatten(TreeNode* root) {        if(root == NULL)            return;        while(root)        {            if(root -> left != NULL)            {                TreeNode* temp = root -> left;                while(temp -> right != NULL)                    temp = temp -> right;                temp -> right = root -> right;                root -> right = root -> left;                root -> left = NULL;            }            root = root -> right;        }    }};
0 0
原创粉丝点击