您的位置:首页 > 其它

每天一道LeetCode-----将二叉树原地平铺成链式结构

2018-01-04 10:54 232 查看

Flatten Binary Tree to Linked List

原题链接Flatten Binary Tree to Linked List



给定一个二叉树,将其原地平铺成链式结构(按先序遍历的方式平铺)

虽然结果是先序遍历,但是本题不能直接在二叉树上进行先序遍历操作,原因是题目要求在原内存上做修改,也就是说只能改变节点的left和right指针

遇到二叉树的问题,首先想到的就是递归,所以本题仍然需要利用递归求解

对于某个节点,假设它的左右子树都已经按要求转换完毕,那么只需要将这两个子树拼接在一起即可

代码如下

/**
* Definition for a binary tree node.
* struct TreeNode {
*     int val;
*     TreeNode *left;
*     TreeNode *right;
*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
void flatten(TreeNode* root) {
flattenTree(root);
}
private:
/* 返回以root为根节点的子树平铺后的树根节点 */
TreeNode* flattenTree(TreeNode* root)
{
if(!root)   return nullptr;
/* 转换左子树 */
TreeNode* leftTree = flattenTree(root->left);
/* 转换右子树 */
TreeNode* rightTree = flattenTree(root->right);
/* 找到左子树的最后一个节点 */
TreeNode* leftLastNode = leftTree;
while(leftLastNode && leftLastNode->right)
leftLastNode = leftLastNode->right;
/* 将左子树从根节点中移除(因为要移动到右边) */
root->left = nullptr;
/* 只有当左子树不为空时才需要转换,当为空时,右子树位置不需要变化 */
if(leftTree)
{
/* 根节点的左子树作为新的右子树 */
root->right = leftTree;
/* 左子树连接右子树 */
leftLastNode->right = rightTree;
}
/* 返回当前根节点 */
return root;
}
};


本题还是利用递归,以后遇到二叉树的问题,最好首先考虑递归求解
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode
相关文章推荐