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; } } } }