方法一:
1.将二叉搜索树中序遍历出来,并把每个节点都保存在一个list中
2.改变list中每个元素的指向
/**
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 {
List<TreeNode> list=new ArrayList<TreeNode>();
public TreeNode Convert(TreeNode pRootOfTree) {
if(pRootOfTree==null) return null;
TreeNodeToList(pRootOfTree);
convertPoint(pRootOfTree);
return list.get(0);
}
//改变list中所有treeNode的指向
private void convertPoint(TreeNode pRootOfTree) {
// TODO Auto-generated method stub
for(int i=0;i<list.size()-1;i++) {
list.get(i).right=list.get(i+1);
list.get(i+1).left=list.get(i);
}
}
//进行终须遍历并把treeNode放入list中
private void TreeNodeToList(TreeNode pRootOfTree) {
if(pRootOfTree.left!=null) {
TreeNodeToList(pRootOfTree.left);
}
list.add(pRootOfTree);
if(pRootOfTree.right!=null) {
TreeNodeToList(pRootOfTree.right);
}
}
}
方法二:
在中序遍历的过程中记录其前一个节点,并改变前一个节点和该节点的指向
/**
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 {
TreeNode preNode=null; //前一个节点
TreeNode nowNode=null; //当前节点
TreeNode headNode=null; //头结点
public TreeNode Convert(TreeNode pRootOfTree) {
if(pRootOfTree==null) return null;
TreeNodeToList(pRootOfTree);
return headNode;
}
//进行中序遍历
private void TreeNodeToList(TreeNode pRootOfTree) {
if(pRootOfTree.left!=null) {
TreeNodeToList(pRootOfTree.left);
}
preNode=nowNode;
nowNode=pRootOfTree;
if(preNode!=null) {
//改变指向
preNode.right=nowNode;
nowNode.left=preNode;
}else {
headNode=nowNode; //若前一个节点为空,则当前节点必转换后的头结点
}
if(pRootOfTree.right!=null) {
TreeNodeToList(pRootOfTree.right);
}
}
}