1. 程式人生 > >114. Flatten Binary Tree to Linked List的C++解法

114. Flatten Binary Tree to Linked List的C++解法

題目描述:https://leetcode.com/problems/flatten-binary-tree-to-linked-list/

這個題的關鍵是找到左右子樹的最右下角的位置,因為這將是下一次接子樹的起點。下面這個方法用了遞迴,假設左右子樹將在helper中接好,並且helper返回的是接好的子樹的最右下角的位置。

class Solution {
public:
    void flatten(TreeNode* root) {
        helper(root);
    }
    TreeNode* helper(TreeNode* root){
        if (root==NULL) return NULL;
        TreeNode* left=helper(root->left);// left記錄了root->left的最右下角的位置,用於接上root->right
        TreeNode* right=helper(root->right);//right 記錄了root->right最右下角的位置,拼接完成後這將是root的最右下角
        if (left!=NULL) 
        {
            left->right=root->right;//將右子樹接到左子樹最下面
            root->right=root->left;//將整棵左子樹接到右子樹的位置
            root->left=NULL;
         }
        if (right!=NULL) return right;//右子樹存在最右下角的位置則優先返回這個位置(因為這個位置將是最右的)
        if (left!=NULL) return left;//如果沒有右子樹的右下角,則左子樹的右下角是最後一個位置
        return root;//都沒有就返回根
    }
};

更好的做法:
只有左邊還有子樹,就用一個指標遍歷到左邊子樹的最最右邊到底的一個節點,然後把root右邊子樹全部掛在這個節點上,然後再通過root->right = root -> left; root -> left = NULL; 消滅右邊子樹,然後root = root-> right;迴圈往復,不斷消滅右邊子樹。

class Solution {
public:
    void flatten(TreeNode *root) {
        if (root == NULL) return;  
        while (root) {  
            if (root->left) {  
                TreeNode *pre = root->left;  
                while (pre->right)  
                    pre = pre->right;  
                pre->right = root->right;  
                root->right = root->left;  
                root->left = NULL;  
            }
            root = root->right;
        }  
    }
};