114. Flatten Binary Tree to Linked List (Stack, Tree; DFS)
Given a binary tree, flatten it to a linked list in-place.
 For example,
Given
         1
        / \
       2   5
      / \   \
     3   4   6
The flattened tree should look like:
   1
    \
     2
      \
       3
        \
         4
          \
           5
            \
             6
法I:递归,前序遍历
/** * 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) return; else preOrderTraverse(root); } TreeNode* preOrderTraverse(TreeNode* root){ TreeNode* rightHead = root->right; //save root->right TreeNode* tail; if(!root->left && !rightHead){ return root; } if(root->left) { //have left child root->right = root->left; root->left = NULL; tail = preOrderTraverse(root->right); if(rightHead){ //have both left child and right child tail->right = rightHead; //如果left==NULL, 这里就不能使用tail->right,所以得分开讨论有右子树情况 tail = preOrderTraverse(rightHead); } } else{ //only have right child tail = preOrderTraverse(rightHead); } return tail; } };
法II:迭代
每次循环,找到左子树前序遍历的最后一个节点(即最右的叶子节点),把右节点作为它的右儿子,当前节点的右儿子置为左节点,左节点置为NULL。
然后把当前节点挪到它的右儿子,进入下一次循环
/** * Definition for binary tree * 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; TreeNode *cur = root, *tail = NULL; while (cur != NULL) { if (cur->left != NULL) { tail = cur->left; while (tail->right) tail = tail->right; tail->right = cur->right; cur->right = cur->left; cur->left = NULL; } cur = cur->right; } } };
 
                    
                     
                    
                 
                    
                 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号 
