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

思路

class Solution {
public:
    void flatten(TreeNode* root) {
        while (root != nullptr) {
            if (root->left != nullptr) {
                auto most_right = root->left; // 如果左子树不为空, 那么就先找到左子树的最右节点
                while (most_right->right != nullptr) most_right = most_right->right; // 找最右节点
                most_right->right = root->right; // 然后将跟的右孩子放到最右节点的右子树上
                root->right = root->left; // 这时候跟的右孩子可以释放, 因此我令左孩子放到右孩子上
                root->left = nullptr; // 将左孩子置为空
            }
            root = root->right; // 继续下一个节点
        }
        return;
    }
};

作者:hellozhaozheng
链接:https://leetcode-cn.com/problems/two-sum/solution/biao-biao-zhun-zhun-de-hou-xu-bian-li-dai-ma-jian-/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

代码

class Solution {
public:
    void flatten(TreeNode* root) {
        for(TreeNode* p = root; p != nullptr; p = p->right){
            if (p->left == nullptr)continue; 
            TreeNode* most_right = p->left;
            while (most_right->right != nullptr) most_right = most_right->right;
            most_right->right = p->right;
            p->right = p->left;
            p->left = nullptr;
        }
    }
};

思路

这个题目我一开始是想先序遍历,后来看别人的题解才明白是一个找规律的题目。记住了