Algorithm/src/main/java/tree/Flatten.java

79 lines
2.4 KiB
Java
Raw Normal View History

2025-03-24 18:58:37 +08:00
package tree;
import java.util.ArrayList;
import java.util.Deque;
import java.util.LinkedList;
import java.util.List;
/**
* 题目 114. 二叉树展开为链表 (rightSideView)
* 描述给你二叉树的根结点 root 请你将它展开为一个单链表
* 展开后的单链表应该同样使用 TreeNode 其中 right 子指针指向链表中下一个结点而左子指针始终为 null
* 展开后的单链表应该与二叉树 先序遍历 顺序相同
* 链接https://leetcode.cn/problems/flatten-binary-tree-to-linked-list/
*/
public class Flatten {
public void inOrderTraversal(TreeNode root,List<TreeNode>list){
if(root!=null) {
list.add(root);
inOrderTraversal(root.left, list);
inOrderTraversal(root.right, list);
}
}
//O(N)空间复杂度 递归前序
public void flatten(TreeNode root) {
List<TreeNode>list=new ArrayList<>();
TreeNode head=new TreeNode(0);
TreeNode tp=head;
inOrderTraversal(root,list);
for (TreeNode treeNode : list) {
tp.left=null;
tp.right=treeNode;
tp=tp.right;
}
}
//迭代前序遍历也要回
public void flatten1(TreeNode root) {
if (root == null) {
return;
}
Deque<TreeNode> stack = new LinkedList<TreeNode>();
stack.push(root);
TreeNode prev = null;
while (!stack.isEmpty()) {
TreeNode curr = stack.pop();
if (prev != null) {
prev.left = null;
prev.right = curr;
}
TreeNode left = curr.left, right = curr.right;
if (right != null) {
stack.push(right);
}
if (left != null) {
stack.push(left);
}
prev = curr;
}
}
//O(1)空间
public void flatten2(TreeNode root) {
TreeNode curr = root;
while (curr != null) {
if (curr.left != null) {
TreeNode next = curr.left;
TreeNode predecessor = next;
while (predecessor.right != null) {
predecessor = predecessor.right;
}
predecessor.right = curr.right;
curr.left = null;
curr.right = next;
}
curr = curr.right;
}
}
}