[LeetCode] Flatten Binary Tree to Linked List

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


这题想了很长时间,思路最终是有了,但是实现又花了一番功夫,结果写出一个把所有节点都放在了左孩子的版本,提交了以后才发现。。。改来改去弄了半天才AC,总之就是递归思路不是很清晰。 现在来描述一下思路:我要flatten一颗树,因为要按先序遍历的顺序,所以就必须像这样链接:
      当前node
        
        左孩子
          
          右孩子

所以我们拿到一棵树,首先要递归的flatten他的左右孩子,然后再向上图一样连起来。这是大的递归思路,然后就是怎么链接的问题,因为右孩子要连在左孩子尾巴上,所以我们必须拿到左孩子的尾巴(叶子节点),所以干脆让每次递归都返回树的叶子节点就方便多了。
归纳:
1. 没孩子:当前节点就是叶子节点,直接返回当前节点。
2.只有左孩子:直接把flatten后的左孩子拿到右边放好,然后返回他的尾巴。
3.只有右孩子:flatten右孩子,返回他的尾巴
4.有左右孩子:分别flatten左、右孩子,把右孩子连到左孩子尾巴,把左孩子拿到右边放好,返回右孩子尾巴。
TreeNode *flattenIter(TreeNode *node) {
    if (!node) return NULL;
    if (!node->left && !node->right) {
        return node;
    }

    TreeNode *leftTail = flattenIter(node->left);
    TreeNode *rightTail = flattenIter(node->right);
    
    if (leftTail && node->right) {
        leftTail->right = node->right;
        node->right = node->left;
        node->left = NULL;
        return rightTail;
    }
    else if (leftTail) {
        node->right = node->left;
        node->left = NULL;
        return leftTail;
    }
    return rightTail;
}

void flatten(TreeNode *root) {
    flattenIter(root);
}
原文地址:https://www.cnblogs.com/agentgamer/p/4085111.html