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

做这道题的时候看到一个很好看的解法,理解了之后确实觉得很简洁且可读性也不错。基本的思路就是循环去调整每个节点的左儿子指针和右儿子指针,右指针相当于调整后的链表中的每个节点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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值