LeetCode - Flatten Binary Tree to Linked List | Darren's Blog



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
If you notice carefully in the flattened tree, each node's right child points to the next node of a pre-order traversal.
Recursive Version
From http://fisherlei.blogspot.com/2012/12/leetcode-flatten-binary-tree-to-linked.html
void flatten(TreeNode *root) {  
       // Start typing your C/C++ solution below  
       // DO NOT write int main() function  
       if(root == NULL)  
            return;  
       ConvertToLink(root);  
  }  
  TreeNode* ConvertToLink(TreeNode* node)  
  {  
       if(node->left == NULL && node->right == NULL)  
            return node;  
       TreeNode* rHead = NULL;  
       if(node->right != NULL)  
           rHead = ConvertToLink(node->right);               
       TreeNode* p = node;  
       if(node->left!=NULL)  
       {  
            TreeNode* lHead = ConvertToLink(node->left);   
            node->right = lHead;  
            lHead->left = NULL;  
            node->left = NULL;  
            while(p->right!=NULL)  
                 p = p->right;  
       }       
       if(rHead != NULL)  
       {  
            p->right = rHead;  
            rHead->left = NULL;  
       }  
       return node;  

  }
[已犯错误]
1. Line 13~14
    刚开始的时候,首先flatten左树,然后处理右树。但是这样会导致处理右树的时候,节点的值已经在处理树的时候被破坏了。比如树为{1,2,3},
     1
  /     \
2       3
如果先处理左树的话,当执行node->right = lhead的时候,右节点就已经被破坏了,node->right指向了2,而不是3。
1
   \
     2  (3)
当然,也可以用一个变量在处理左树前,保存右树地址。但是没必要,先处理右树就好了。
2. Line 22~23
    该循环是用于将p指针遍历到左树链表的最右节点。第一版时,这个循环是放在if语句以外,这就导致了,不必要的迭代了。比如当输入为{1,#,2}时,这个while循环会导致p指针遍历到右子树的最右节点,这显然是错的。
3. Line 20, 28
    不要忘了清空每一个指针,在新的链表中,左指针没必要保留
from http://www.darrensunny.me/leetcode-flatten-binary-tree-to-linked-list/
private TreeNode recursiveFlatten(TreeNode t) {
        if (t == null)      // Empty tree
            return null;
        // Recursively flatten its left and right subtrees
        TreeNode leftLeaf = recursiveFlatten(t.left);
        TreeNode rightLeaf = recursiveFlatten(t.right);
        if (leftLeaf == null && rightLeaf == null)    // The tree is a leaf itself
            return t;
        if (leftLeaf == null)    // Has only right subtree; already flattened
            return rightLeaf;
        if (rightLeaf == null) { // Has only left subtree; make it right
            t.right = t.left;
            t.left = null;
            return leftLeaf;
        }
        // Has both left and right subtrees
        // Put the left subtree in between the root and the right subtree
        TreeNode temp = t.right;
        t.right = t.left;
        t.left = null;
        leftLeaf.right = temp;
        return rightLeaf;
    }
Iterative Version: Use stack from http://www.programcreek.com/2013/01/leetcode-flatten-binary-tree-to-linked-list/
Go down through the left, when right is not null, push right to stack.
public void flatten(TreeNode root) {
        Stack<TreeNode> stack = new Stack<TreeNode>();
        TreeNode p = root;
 
        while(p != null || !stack.empty()){
 
            if(p.right != null){
                stack.push(p.right);
            }
 
            if(p.left != null){
                p.right = p.left;
                p.left = null;
            }else if(!stack.empty()){
                TreeNode temp = stack.pop();
                p.right=temp;
            }
 
            p = p.right;
        }
    }
Also read http://blog.csdn.net/perfect8886/article/details/20000083
Read full article from LeetCode - Flatten Binary Tree to Linked List | Darren's Blog

No comments:

Post a Comment

Labels

Algorithm (219) Lucene (130) LeetCode (97) Database (36) Data Structure (33) text mining (28) Solr (27) java (27) Mathematical Algorithm (26) Difficult Algorithm (25) Logic Thinking (23) Puzzles (23) Bit Algorithms (22) Math (21) List (20) Dynamic Programming (19) Linux (19) Tree (18) Machine Learning (15) EPI (11) Queue (11) Smart Algorithm (11) Operating System (9) Java Basic (8) Recursive Algorithm (8) Stack (8) Eclipse (7) Scala (7) Tika (7) J2EE (6) Monitoring (6) Trie (6) Concurrency (5) Geometry Algorithm (5) Greedy Algorithm (5) Mahout (5) MySQL (5) xpost (5) C (4) Interview (4) Vi (4) regular expression (4) to-do (4) C++ (3) Chrome (3) Divide and Conquer (3) Graph Algorithm (3) Permutation (3) Powershell (3) Random (3) Segment Tree (3) UIMA (3) Union-Find (3) Video (3) Virtualization (3) Windows (3) XML (3) Advanced Data Structure (2) Android (2) Bash (2) Classic Algorithm (2) Debugging (2) Design Pattern (2) Google (2) Hadoop (2) Java Collections (2) Markov Chains (2) Probabilities (2) Shell (2) Site (2) Web Development (2) Workplace (2) angularjs (2) .Net (1) Amazon Interview (1) Android Studio (1) Array (1) Boilerpipe (1) Book Notes (1) ChromeOS (1) Chromebook (1) Codility (1) Desgin (1) Design (1) Divide and Conqure (1) GAE (1) Google Interview (1) Great Stuff (1) Hash (1) High Tech Companies (1) Improving (1) LifeTips (1) Maven (1) Network (1) Performance (1) Programming (1) Resources (1) Sampling (1) Sed (1) Smart Thinking (1) Sort (1) Spark (1) Stanford NLP (1) System Design (1) Trove (1) VIP (1) tools (1)

Popular Posts