二叉搜索树与双向链表 - Java
题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
思路
二叉搜索树的中序遍历是有序的 - 不知道二叉搜索树的看我的上一篇文章
方法一(用数组记录下中序遍历后的值,再重新组合)
import java.util.ArrayList;
import java.util.List;
public class Solution {
public TreeNode Convert(TreeNode pRootOfTree) {
if(pRootOfTree == null){
return null;
}
ArrayList<TreeNode> list = new ArrayList<>();
// 中序遍历
Convert(list,pRootOfTree);
// 构建双向链表
return Convert(list);
}
public void Convert(ArrayList<TreeNode> list,TreeNode root){
if(root != null){
Convert(list,root.left);
list.add(root);
Convert(list,root.right);
}
}
public TreeNode Convert(ArrayList<TreeNode> list){
TreeNode head = list.get(0);
TreeNode cur = head;
for (int i=1;i< list.size();++i){
TreeNode node=list.get(i);
node.left=cur;
cur.right=node;
cur=node;
}
return head;
}
}
绝,太绝了!
方法二(线索化,中序遍历的逆转思维,右->根->左)
public class Solution {
TreeNode pre=null;
public TreeNode Convert(TreeNode pRootOfTree) {
if (pRootOfTree==null)
return null;
Convert(pRootOfTree.right);
if (pre!= null){
pRootOfTree.right=pre;
pre.left=pRootOfTree;
}
pre=pRootOfTree;
Convert(pRootOfTree.left);
return pre;
}
}