欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

114. 二叉树展开为链表

程序员文章站 2024-03-26 13:38:11
...

题目:

114. 二叉树展开为链表
114. 二叉树展开为链表

题解:

解题思路:
思路来源于很多人的题解,按先序遍历来看,1的右子树5,6都该在4的后面。
114. 二叉树展开为链表
114. 二叉树展开为链表

         1
        / \
       2   5
      / \   \
     3   4   6    ,
所以我们可以直接将1节点的右子树(5 -> 6)移接到左子树的最右边节点4上:

         1                                                     
        / 
       2   
      / \   
     3   4 
          \
           5
            \
             6,然后把整个左子树(23456)移到右边,这样我们就完成了第一层的恢复:
             
         1
          \ 
           2   
          / \   
         3   4 
              \
               5
                \
                 6       然后进入右子树,继续上面的操作:

         1
          \ 
           2   
          / 
         3 
         \    
          4 
           \
            5
             \
              6      我们可以直接将2节点的右子树(4 -> 5 -> 6)移接到左子树的最右边节点3上:

	  1
	    \
	     2          
	      \          
	       3      
	        \
	         4  
	          \
	           5
	            \
	             6   然后把整个左子树(3456)移到右边,这样我们就完成了第二层的恢复:

结束。

114. 二叉树展开为链表

代码:

1. 递归法:

/**
 * code114
 */
public class code114 {

    public static void flatten(TreeNode root) {
        if (root == null) {
            return;
        }
        if (root.left != null) {
            TreeNode pre = root.left;
            while (pre.right != null) {
                pre = pre.right;
            }
            pre.right = root.right;
            root.right = root.left;
            root.left = null;
        }
        flatten(root.right);
    }

    public static void main(String[] args) {
        Integer nums[] = { 1, 2, 5, 3, 4, null, 6 };
        TreeNode tree = ConstructTree.constructTree(nums);
        System.out.println("***************************************");
        TreeOperation.show(tree);
        System.out.println("***************************************");
        flatten(tree);
        TreeOperation.show(tree);
        System.out.println("***************************************");
    }
}

2. 迭代法:

/**
 * code114
 */
public class code114 {

    // 迭代法:
    public static void flatten(TreeNode root) {
        if (root == null) {
            return;
        }
        while (root != null) {
            if (root.left != null) {
                TreeNode pre = root.left;
                while (pre.right != null) {
                    pre = pre.right;
                }
                pre.right = root.right;
                root.right = root.left;
                root.left = null;
            }
            root = root.right;
        }
    }

    public static void main(String[] args) {
        Integer nums[] = { 1, 2, 5, 3, 4, null, 6 };
        TreeNode tree = ConstructTree.constructTree(nums);
        System.out.println("***************************************");
        TreeOperation.show(tree);
        System.out.println("***************************************");
        flatten(tree);
        TreeOperation.show(tree);
        System.out.println("***************************************");
    }
}

参考:

  1. 递归与非递归,思路简单
  2. 详细通俗的思路分析,多解法
  3. 二叉树展开为链表—两种递归+非递归
  4. 递归和迭代