LeetCode Flatten Binary Tree to Linked List 将二叉树展开成链表

浅浅的花香味﹌ 2022-06-08 03:16 251阅读 0赞

题目描述:

Flatten a binary tree to a fake “linked list” in pre-order traversal.
Here we use the right pointer in TreeNode as the next pointer in ListNode.

样例输入:

  1. 1
  2. / \ 2 5
  3. / \ \ 3 4 6

样例输出:

  1. 1
  2. \ 2
  3. \ 3
  4. \ 4
  5. \ 5
  6. \ 6

解法一
使用递归的思想,首先使用DFS思路找到左子树的最左节点,然后将该最左节点的父节点和右子树断开,把该最左节点连接到父节点的右节点上,左节点置为null,再把原右子树连接到原左子树的最右节点上,再往上遍历

步骤:
首先找到最左节点3

  1. 1
  2. / \ 2 5
  3. / \ \ 3 4 6

断开父节点2和4的连接 把3连接到2的右子节点 再把4连接到3的右节点

  1. 1
  2. / \ 2 5
  3. \ \ 3 6
  4. \ 4

再把1和右子树5断开 把左子树2连接到1的右节点上 右子树5连接到左子树的最右节点4的右节点上

  1. 1
  2. \ 2
  3. \ 3
  4. \ 4
  5. \ 5
  6. \ 6

代码

  1. public void flattenRecursion(TreeNode root) {
  2. if (root == null) {
  3. return;
  4. }
  5. /*使用DFS思路找到最左子节点*/
  6. if (root.left != null) {
  7. flattenRecursion(root.left);
  8. }
  9. if (root.right != null) {
  10. flattenRecursion(root.right);
  11. }
  12. /*把其父节点和右子节点断开,将原左子结点连上父节点的右子节点上*/
  13. TreeNode tmp = root.right;
  14. root.right = root.left;
  15. root.left = null;
  16. /*然后再把原右子节点连到新右子节点的右子节点上*/
  17. while (root.right != null) {
  18. root = root.right;
  19. }
  20. root.right = tmp;
  21. }

解法2
【递归能实现的循环就能实现┐(‘~`;)┌ 】首先判断当前节点的左子树是否为空,如果左子树非空的话,就断开当前节点和右子树,把当前节点的右指针指向左子树,再把原右子树连接到原左子树的最右节点
步骤描述:

  1. 1
  2. / \ 2 5
  3. / \ \ 3 4 6

首先根节点1的左子树2非空 断开1和5的连接 把1的右指针指向2 再把右子树5连接到2的最右节点4的右节点上

  1. 1
  2. \ 2
  3. / \ 3 4
  4. \ 5
  5. \ 6

再继续判断以2为根的树 2的左节点3非空 继续进行上述操作

  1. 1
  2. \ 2
  3. \ 3
  4. \ 4
  5. \ 5
  6. \ 6

代码实现

  1. public void flattenLoop(TreeNode root) {
  2. public void flattenLoop(TreeNode root) {
  3. TreeNode cur = root;
  4. while (cur != null) {
  5. //遍历节点 如果左节点不为空的话
  6. if (cur.left != null) {
  7. //找到左子树的最右节点 目的是把原右子树连接到该节点的右节点上
  8. TreeNode p = cur.left;
  9. while (p.right != null) {
  10. p = p.right;
  11. }
  12. //断开当前节点和右子树 把左子树连接到当前节点的右节点 把原右子树连接到原左子树的最右节点的右子树上
  13. p.right = cur.right;
  14. cur.right = cur.left;
  15. cur.left = null;
  16. }
  17. //当前节点为右子树的根节点 即原左子树的根节点
  18. cur = cur.right;
  19. }
  20. }

解法三
使用层序遍历来实现 需要借助辅助空间来实现

  1. public void flattenPreOrder(TreeNode root) {
  2. if(root == null){
  3. return;
  4. }
  5. Stack<TreeNode> stack = new Stack<TreeNode>();
  6. stack.push(root);
  7. while(!stack.empty()){
  8. TreeNode tmp = stack.pop();
  9. if(tmp.left!=null){
  10. TreeNode l = tmp.left;
  11. while(l.right!=null){
  12. l = l.right;
  13. }
  14. TreeNode r = tmp.right;
  15. tmp.right = tmp.left;
  16. tmp.left = null;
  17. l.right = r;
  18. }
  19. if(tmp.right!=null){
  20. stack.push(tmp.right);
  21. }
  22. }
  23. }

发表评论

表情:
评论列表 (有 0 条评论,251人围观)

还没有评论,来说两句吧...

相关阅读