1.题目描述(传送门)
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点(好像可以创建一两个。。),只能调整树中结点指针的指向。
2.code(java1.7版本)
直接中序遍历操作版本
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
TreeNode head=null;
TreeNode realhead=null;
public void help(TreeNode root){
if(root==null)return;
help(root.left);
if(head==null){
head=root;
realhead=root;
}
else{
head.right=root;
root.left=head;
head=root;
}
help(root.right);
}
public TreeNode Convert(TreeNode pRootOfTree) {
if(pRootOfTree==null)return null;
help(pRootOfTree);
return realhead;
}
}
借助Vector中序遍历版本
import java.util.*;
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
Vector<TreeNode> temp=new Vector<TreeNode>();
public void help(TreeNode root){
if(root==null)return;
help(root.left);
temp.add(root);
help(root.right);
}
public TreeNode Convert(TreeNode pRootOfTree) {
if(pRootOfTree==null)return null;
help(pRootOfTree);
int len=temp.size();
for(int i=0;i<len-1;i++){
temp.get(i).right=temp.get(i+1);
temp.get(i+1).left=temp.get(i);
}
return temp.get(0);
}
}
3.解题思路
直接中序遍历操作版本
利用二叉搜索树的中序遍历的排序特性,运用递归的办法进行中序的遍历,并运用两个TreeNode节点来记录头节点一个中间节点,分别为realhead和head。在二叉搜索树中序遍历的时候,最先对节点操作的是最小的一个节点,记为当前节点,用head进行临时的保存,在往下遍历的时候,便是次小的节点,这样便将head节点和当前次小的节点进行双向的关联,并将head赋值为当前次小的节点,这样不断的中序遍历,即可完成整个二叉树的双向链表排序的建立。
借助Vector中序遍历版本
这个解题的思路比较简单,就是对二叉搜索树进行简单的中序遍历,并运用Vector进行遍历节点的保存,在直接对保存的节点进行双向链接的操作即可完成。