题目:
给定一个二叉树,原地将它展开为链表。
例如,给定二叉树
1 / \ 2 5 / \ \ 3 4 6
将其展开为:
1 \ 2 \ 3 \ 4 \ 5 \ 6
解题思路:
数据访问顺序是前序遍历的,可以递归也可以迭代,使用右节点作为链表的next。
时间复杂度O(n),空间复杂度O(logn)。
代码实现:
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public void flatten(TreeNode root) { if (root == null) return; Stack<TreeNode> stack = new Stack<TreeNode>(); TreeNode p = root; while (p != null) { if (p.right != null) stack.push(p.right); p.right = p.left; p.left = null; if (p.right == null && !stack.isEmpty()) { p.right = stack.pop(); } p = p.right; } } }