114. Flatten Binary Tree to Linked List

一、题目

  1、审题

  2、分析

    给出一棵二叉树,按照先序遍历顺序组成一棵斜右二叉树。

 

二、解答

  1、思路:

    方法一、 

      采用一个栈进行先序遍历,遍历时将节点重新组装。

public void flatten(TreeNode root) {
        Stack<TreeNode> stack = new Stack<TreeNode>();
        if(root == null)
            return;
        stack.add(root);
        TreeNode tmpNode = root;
        
        while(!stack.isEmpty()) {
            
            TreeNode node = stack.pop();
            
            if(node.right != null)
                stack.add(node.right);
            
            if(node.left != null)
                stack.add(node.left);
            
            if(node != root) {
                tmpNode.right = node;
                tmpNode.left = null;
                tmpNode = node;
            }
        }
    }

  

  方法二、

    采用递归

    递归实现 右-->左-->根 遍历,并拼接原二叉树的节点顺序。

   private TreeNode prev = null;
    public void flatten(TreeNode root) {
        if(root == null)
            return;
        
        flatten(root.right);
        flatten(root.left);
        
        root.right = prev;
        root.left = null;
        prev = root;
    }

 

  方法三、

    采用 Morris Traversal 方法线索二叉树。

    线索二叉树,利用叶子节点中的空闲指针指向中序遍历的后续一个节点。

    性能较好,O(1)空间复杂度

    public void flatten3(TreeNode root) {
        
        TreeNode cur = root;
        TreeNode pre = root;
        
        while(cur != null) {
            
            if(cur.left == null) {
                cur = cur.right;
            }
            else {
                pre = cur.left;
                while(pre.right != null && pre.right != cur)
                    pre = pre.right;
                
                if(pre.right == null) {
                    pre.right = cur;
                    cur = cur.left;
                }
                else {
                    TreeNode right = cur.right;
                    cur.right = cur.left;
                    cur.left = null;
                    pre.right = right;
                    cur = right;
                }
            }
        }
    }

 

posted @ 2018-10-04 22:10  skillking2  阅读(113)  评论(0编辑  收藏  举报