标签: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