这一题实际上就是中序遍历二叉树,并且修改指针。
从后往前修改指针:
public static TreeNode convert(TreeNode root){
Stack<TreeNode> stack=new Stack<TreeNode>();
inOrder(root,stack);
TreeNode pre,max=null;
while(!stack.isEmpty()){
max=stack.pop();
if(stack.isEmpty()) break;
pre=stack.peek();
pre.right=max;
max.left=pre;
}
return max;
}
public static void inOrder(TreeNode root,Stack<TreeNode> stack){
if(root==null) return;
if(root.left!=null) inOrder(root.left,stack);
stack.push(root);
if(root.right!=null) inOrder(root.right,stack);
}
结合中序遍历的非递归实现,代码可以更精简(从前往后修改指针)。
public static TreeNode toLinkList(TreeNode root){
if(root==null) return null;
Stack<TreeNode> stack=new Stack<TreeNode>();
TreeNode cur=root,pre=null,result=null;
boolean isFirst=true;
while(cur!=null||!stack.isEmpty()){
if(cur!=null){
stack.push(cur);
cur=cur.left;
}else{
cur=stack.pop();
if(isFirst){
isFirst=false;
pre=cur;
result=cur;
}else{
pre.right=cur;
cur.left=pre;
pre=cur;
}
cur=cur.right;
}
}
return result;
}