剑指offer_二叉搜索树与双向链表
题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点 指针的指向。

方法一:先中序遍历存在list里面,得到有序序列,之后再一个个串起来
1 /** 2 public class TreeNode { 3 int val = 0; 4 TreeNode left = null; 5 TreeNode right = null; 6 7 public TreeNode(int val) { 8 this.val = val; 9 10 } 11 12 } 13 */ 14 import java.util.*; 15 public class Solution { 16 17 public TreeNode Convert(TreeNode pRootOfTree) { 18 ArrayList<TreeNode> list = reads(pRootOfTree); 19 if(pRootOfTree==null) return (TreeNode)(null); 20 for(int i=0;i<list.size()-1;i++){ 21 list.get(i).right = list.get(i+1); 22 } 23 for(int i=list.size()-1;i > 0;i--){ 24 list.get(i).left = list.get(i-1); 25 } 26 return list.get(0); 27 } 28 public ArrayList<TreeNode> reads(TreeNode root){ 29 if(root == null) return new ArrayList(); 30 ArrayList<TreeNode> list = new ArrayList<>(); 31 list.addAll(reads(root.left)); 32 list.add(root); 33 list.addAll(reads(root.right)); 34 return list; 35 } 36 }
思路二:
1 /** 2 public class TreeNode { 3 int val = 0; 4 TreeNode left = null; 5 TreeNode right = null; 6 7 public TreeNode(int val) { 8 this.val = val; 9 10 } 11 12 } 13 */ 14 public class Solution { 15 private TreeNode pre = null; 16 private TreeNode head = null; 17 public TreeNode Convert(TreeNode pRootOfTree) { 18 order(pRootOfTree); 19 return head; 20 } 21 public void order(TreeNode root){ 22 if(root == null) return; 23 order(root.left); 24 root.left = pre; 25 if(pre!=null) pre.right = root; 26 pre = root; 27 if(head==null) head = root; 28 order(root.right); 29 } 30 }
直接运算求解,主要就是设置一个索引pre不停的跳,然后head是一开始的pre赋值

浙公网安备 33010602011771号