题解 | #二叉搜索树与双向链表#
二叉搜索树与双向链表
https://www.nowcoder.com/practice/947f6eb80d944a84850b0538bf0ec3a5
方法1、中序遍历+全员入队
public class Solution {
Queue<TreeNode>queue=new LinkedList<>();
public TreeNode Convert(TreeNode pRootOfTree) {
inOrder(pRootOfTree);
TreeNode head=queue.poll();
TreeNode cur=head;
TreeNode pre=null;
while(!queue.isEmpty()){
pre=cur;
cur=queue.poll();
pre.right=cur;
cur.left=pre;
}
return head;
}
public void inOrder(TreeNode cur){
if(cur==null)
return ;
inOrder(cur.left);
queue.offer(cur);
inOrder(cur.right);
}
}
方法2、中序遍历+递归
难点在于需要创建两个变量来记录链表的头和每个节点的父节点
public class Solution {
TreeNode head=null;
TreeNode pre=null;
public TreeNode Convert(TreeNode root) {
if(root==null)return null;
Convert(root.left);
if(pre==null){
head=root;
pre=root;
}else{
pre.right=root;
root.left=pre;
pre=root;
}
Convert(root.right);
return head;
}
}
知识点、递归到左下角的语句为pre==null保证了该节点是从根节点开始遍历的第一个节点,在中序遍历的情况下就为左下角节点
if(root==null)return null;
Convert(root.left);
if(pre==null){
head=root;
pre=root;
}