码迷,mamicode.com
首页 > 其他好文 > 详细

[LeetCode] Flatten Binary Tree to Linked List

时间:2014-11-09 15:04:28      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   ar   os   sp   for   div   on   

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);
}

 

[LeetCode] Flatten Binary Tree to Linked List

标签:style   blog   color   ar   os   sp   for   div   on   

原文地址:http://www.cnblogs.com/agentgamer/p/4085111.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!