每天一道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-----以字符串的形式输出二叉树所有从根节点到叶子节点的路径
- 每天一道LeetCode-----计算二叉树所有根节点到叶子节点的和
- 每天一道LeetCode-----二叉树逐层遍历,每一层存在一个序列中,返回所有序列集合
- 每天一道LeetCode-----判断两个二叉树是否相同
- 每天一道LeetCode-----为二叉树增加next节点,指向同一层的下一个节点
- 每天一道LeetCode-----判断二叉树左右两边是否成镜像关系
- 每天一道LeetCode-----根据中序遍历和后序遍历重构二叉树
- 每天一道LeetCode-----计算二叉树的最大深度及最小深度,判断二叉树是否是高度平衡二叉树
- 每天一道LeetCode-----找到二叉树所有和为给定值的路径
- 每天一道LeetCode-----根据先序遍历和中序遍历还原二叉树
- 每天一道LeetCode-----从右向左观察一棵二叉树,返回能看到的元素
- 每天一道LeetCode-----计算二叉树的最大路径和,路径只需要从一个节点到达另一个节点,无其他要求
- 每天一道LeetCode-----找到给定数组的连续子数组,使这个子数组的和最大,要求复杂度为O(n)
- 链式结构实现二叉树
- 每天一道LeetCode-----判断一个数是否是happy number(每一位的平方和最终为1)
- 二叉树的链式存储结构----二叉链表
- 二叉树的链式结构。
- 每天一道LeetCode-----将字符串切分,使每个子串都是回文串,计算所有可能结果和最小切分次数
- 每天一道leetcode203-移除链表的元素
- 【数据结构】二叉树链式结构实现_BiTreeLink