题目:
给定一个二叉树,原地将它展开为链表。
例如,给定二叉树
1
/ \
2 5
/ \ \
3 4 6
将其展开为:
1
\
2
\
3
\
4
\
5
\
6
题目分析
- 要求:二叉树 ==> 按中序遍历结果 ==>链表
分析
中序遍历:根结点 ==> 左节点 ==> 右节点
对某一结点进行链表展开
左子树链表展开后连接到根结点的右节点
右子树链表展开后连接到变为右节点的左子树的最后一个结点之后
如下图所示
解题思路
变量 | 作用 |
---|---|
find() | 找到链表的最后一个结点 |
right | 暂时保存根结点的右子树 |
过程
如果根结点不为空
- 保存根结点的右子树
- 对左子树进行链表展开
- 左子树的展开链表连接到根结点的右结点
- 右子树连接到右节点的最后一个结点之后
- 右子树进行链表展开
- 递归
代码如下
TreeNode*find(TreeNode*root) {
if(!root) return NULL;
if(root->right) return find(root->right);
else return root;
} //寻找链表的最后一个结点
class Solution {
public:
void flatten(TreeNode* root) {
if(root!=NULL){
TreeNode *right;
if (root!= NULL)right = root->right; //保存右子树
if (root->left) flatten(root->left);
if (root->left) root->right = root->left;
TreeNode *right0;
right0 = find(root->left); //标记最后一个结点
if(right0!=NULL) right0->right = right;
root->left = NULL;
if(right) flatten(right);
}
}
};