zoukankan      html  css  js  c++  java
  • [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);
    }
  • 相关阅读:
    数据仓库基础(十四)缓慢变化维
    数据仓库基础(十三)Informatica workflow
    数据仓库基础(十二)Informatica组件(2)
    数据仓库基础(十一)Informatica小技巧(2)
    数据仓库基础(十)组件1
    数据仓库基础(九)Informatica小技巧(1)
    数据仓库基础(八)Informatica 小例子
    数据仓库基础(七)Informatica PowerCenter介绍
    数据仓库基础(六)数据的ETL
    数据仓库基础(五)数据仓库系统应用实例
  • 原文地址:https://www.cnblogs.com/agentgamer/p/4085111.html
Copyright © 2011-2022 走看看