[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

» Solve this problem

[解题思路]
递归解法。对于任一节点,flatten左树,然后节点插入左树最左边,成为新的头节点。flatten右树,右树最左边接上新链表的最右节点。

[Code]

1:  void flatten(TreeNode *root) {  
2: // Start typing your C/C++ solution below
3: // DO NOT write int main() function
4: if(root == NULL)
5: return;
6: ConvertToLink(root);
7: }
8: TreeNode* ConvertToLink(TreeNode* node)
9: {
10: if(node->left == NULL && node->right == NULL)
11: return node;
12: TreeNode* rHead = NULL;
13: if(node->right != NULL)
14: rHead = ConvertToLink(node->right);
15: TreeNode* p = node;
16: if(node->left!=NULL)
17: {
18: TreeNode* lHead = ConvertToLink(node->left);
19: node->right = lHead;
20: lHead->left = NULL;
21: node->left = NULL;
22: while(p->right!=NULL)
23: p = p->right;
24: }
25: if(rHead != NULL)
26: {
27: p->right = rHead;
28: rHead->left = NULL;
29: }
30: return node;
31: }

[已犯错误]
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
    不要忘了清空每一个指针,在新的链表中,左指针没必要保留。

Update 08/25/2014  being asked this question today. But the interviewer asked for an in-order flatten.
Review previous solution. Actually, I made it too complicate. If travel this tree in pre-order, from the hint, it is easy to construct the linked list.

1:       void flatten(TreeNode *root) {  
2: if(root == NULL) return;
3: TreeNode* right = root->right;
4: if(lastVisitedNode != NULL)
5: {
6: lastVisitedNode->left = NULL;
7: lastVisitedNode->right = root;
8: }
9: lastVisitedNode = root;
10: flatten(root->left);
11: flatten(right);
12: }

pre-order is simple because the root always is the head of flatten list. But if flatten the tree with in-order sequence, need extra parameter to track the head and tail of each flattened sun-tree.
For example, below binary tree.

If we flatten it with in-order, the process should like below. And here I use the left pointer of head node to track the tail node.

1:  TreeNode* flatten(TreeNode *root) {  
2: if (root == NULL) return NULL;
3: TreeNode* rightTree = root->right;
4: TreeNode* newHead = root;
5: TreeNode* leftList = flatten(root->left);
6: if (leftList != NULL)
7: {
8: newHead = leftList;
9: TreeNode* tail = leftList->left;
10: tail->right = root;
11: root->left = tail;
12: leftList->left = root;
13: }
14: TreeNode* rightList = flatten(rightTree);
15: if (rightList != NULL)
16: {
17: root->right = rightList;
18: newHead->left = rightList->left;
19: rightList->left = root;
20: }
21: return newHead;
22: }
本地跟单专家顾问(EA)是一种专为MetaTrader 4平台设计的自动化交易工具。该版本强调其无限制特性,允许用户在任何时段、不同地理区域及各类账户上自由部署,从而为交易者提供了高度灵活的操作空间。其核心机制采用同向复制策略,即接收端会完全模仿发送端的交易方向与操作,适合那些信赖信号源稳定性的用户,以期通过跟随策略实现相近的投资回报。 系统架构包含两个独立模块:信号发送端与信号接收端。发送端安装于主导交易决策的账户,接收端则配置于需同步执行的账户,二者协同工作,实现了交易指令的自动传递与执行,有效减少了人工干预的需求。此外,该工具特别注重与MT4服务器时间的同步,确保交易执行时点的精确性,避免因时区偏差可能引发的操作失误,这对于依赖时间敏感性的外汇市场尤为重要。 文件标识中的特定代号可能指向开发者的内部版本标记或某种定制化交易逻辑,具体含义需结合进一步的技术文档予以确认。整体而言,该EA为多账户管理与策略复制提供了一个集成化解决方案,有助于提升交易执行的效率并降低操作风险。但需注意,市场环境处于持续变动中,任何自动化工具均需经过充分验证与适应性测试,历史表现不能作为未来收益的保证。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值