题目
思路
- 使用堆栈中序遍历二叉搜索树
每次保存上一个节点,然后把上一个节点的right指向当前节点,把当前节点的left指向上一个节点
遍历一遍之后,就得到了一个双向链表
注意一些初始量的设置比如prev一开始是一个新节点
最后要把这个指向新节点的指针指向null,因为链表的第一个节点指向null,接着由我们创造的新节点的left访问到第一个节点返回。 - 使用递归来遍历所有的节点,其他和上面一样
- 对于思路二进行一些微调,考虑到这个遍历除了第一次我们的prev不和node进行连接之外,其他的node都要和prev进行连接,所以我们在遍历的时候用if特地表示第一次的场景来进行节点之间的连接。
代码
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
import java.util.*;
public class Solution {
public TreeNode Convert(TreeNode pRootOfTree) {
LinkedList<TreeNode> s=new LinkedList<>();
TreeNode ans=new TreeNode(-1);
TreeNode prev=ans;
prev.left=null;
if(pRootOfTree==null)return null;
s.addLast(pRootOfTree);
TreeNode cur=pRootOfTree.left;
while(!s.isEmpty()){
while(cur!=null){
s.addLast(cur);
cur=cur.left;
}
TreeNode now=s.removeLast();
prev.right=now;
now.left=prev;
prev=now;
if(now.right!=null){
s.addLast(now.right);
cur=now.right.left;
}
}
ans.right.left=null;
return ans.right;
}
}
法二
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
TreeNode ans=new TreeNode(-1);
TreeNode prev=ans;
public TreeNode Convert(TreeNode pRootOfTree) {
if(pRootOfTree==null)return null;
Convert(pRootOfTree.left);
prev.right=pRootOfTree;
pRootOfTree.left=prev;
prev=pRootOfTree;
Convert(pRootOfTree.right);
ans.right.left=null;
return ans.right;
}
}
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
TreeNode root=null;
TreeNode prev=null;
public TreeNode Convert(TreeNode pRootOfTree) {
if(pRootOfTree==null)return null;
Convert(pRootOfTree.left);
if(root==null)
{
root=pRootOfTree;
}
if(prev!=null){
prev.right=pRootOfTree;
pRootOfTree.left=prev;
}
prev=pRootOfTree;
Convert(pRootOfTree.right);
return root;
}
}