剑指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赋值

posted @ 2019-09-02 11:58  chyblogs  阅读(125)  评论(0)    收藏  举报