作者:耶丝儿小丶姐 | 来源:互联网 | 2023-10-14 17:05
点击查看剑指Offer全解【Java & Golang】实现
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
思路
第一种思路比较直观,使用一个容器收集中序遍历结果,并且将其连接成双向链表即可,这种做法会使用额外的空间复杂度。
第二种思路是通过栈实现中序遍历,在每次中序遍历过程中获取当前节点,并让当前节点和上一个节点相连,并将当前节点设置为上一个节点。这样的做法只需要中序遍历一次即可获取到双线链表,并且不需要使用容器存储整个链表,节约空间。
Java第一种解法【额外的空间复杂度】
import java.util.*;
public class Solution {public TreeNode Convert(TreeNode root) {if (root &#61;&#61; null) {return null;}ArrayList<TreeNode> list &#61; new ArrayList<>();inorder(root, list);for (int i &#61; 1; i < list.size() - 1; i&#43;&#43;) {TreeNode node &#61; list.get(i);node.left &#61; list.get(i - 1);node.right &#61; list.get(i &#43; 1);}list.get(0).left &#61; null;list.get(0).right &#61; (list.size() > 1) ? list.get(1) : null;list.get(list.size() - 1).left &#61; (list.size() > 1) ? list.get(list.size() - 2) : null;list.get(list.size() - 1).right &#61; null;return list.get(0);}private void inorder(TreeNode root, ArrayList<TreeNode> list) {if (root &#61;&#61; null) {return;}inorder(root.left, list);list.add(root);inorder(root.right, list);}
}
Java第二种解法【使用栈做中序遍历】
import java.util.*;
public class Solution {public TreeNode Convert(TreeNode root) {if (root &#61;&#61; null) {return null;}TreeNode res &#61; null;TreeNode pre &#61; null;boolean first &#61; true;Stack<TreeNode> stack &#61; new Stack<>();while (!stack.isEmpty() || root !&#61; null) {if (root !&#61; null) {stack.push(root);root &#61; root.left;} else {TreeNode pop &#61; stack.pop();if (first) {res &#61; pop;pre &#61; pop;pop.left &#61; null;first &#61; false;} else {pre.right &#61; pop;pop.left &#61; pre;pre &#61; pop;}root &#61; pop.right;}}return res;}
}