采用递归的前序遍历方式遍历每个节点
考虑最简单的情况
root为1
root->left为2
root->right为3
将该二叉树变为链表
看看新增一个节点会是什么情况
回到第一种最简单的情况,2节点为根节点的左节点,但此时2节点并没有右子节点,此时,最右子节点为2本身
考虑递归的情况
1)首先找到含有左节点的根节点(2)
2)2的左节点(5)的最右根节点为其本身
3)对2的所有子节点完成转链表操作
4)回溯到1(此时状态为图示的2),对状态2同样进行之前的操作,找到根节点(1)的左节点(2)的最右子节点(4)
5)将根节点(1) 的右节点(3)放到最右子节点(4)的right上
6)将根节点的左节点全部放到右节点上,左节点置空
重点:
如何找到某节点的最右子节点呢?
while(most_right->right!=NULL)
most_right=most_right->right;
知悉上诉思想后,贴出完整代码(源代码参考于leetcode题解)
class Solution {
public:
void flatten(TreeNode* root) {
if(!root)
return;
flatten(root->left);
flatten(root->right);
if(root->left!=NULL)
{
auto most_right=root->left;
while(most_right->right!=NULL)
most_right=most_right->right;
most_right->right=root->right;
root->right=root->left;
root->left=NULL;
}
}
};