在面试过程中经常会出现二叉排序树转换成双向链表的问题
思路:在二叉树的学习中,我会发现,基本所有的问题都可以用树的先序遍历、中序遍历、后序遍历解决,所以我们可以使用这个思路来解决。
在此问题中,使用的是:后序遍历。
/*
* 将二叉树转换成双向链表:直接在树上改动(后序遍历)
*/
public Node change_Linkedlist(Node head){
//首先考虑的是特殊情况,也就是递归的结束条件
if(head==null){
return head;
}
//采用后序遍历的思想
Node left=change_Linkedlist(head.left);
Node right=change_Linkedlist(head.right);
//首先找到以head为根的左子树的最右节点(左子树的最大值)
while(left!=null&&left.right!=null){
left=left.right;
}
//找到以head为根的右子树的最左节点
while(right!=null&&right.left!=null){
right=right.left;
}
//排除特殊情况:若左子树一开始就是空的话(右子树一开始就是空)
if(left!=null){
left.right=head;
head.left=left;
}
if(right!=null){
right.left=head;
head.right=right;
}
return head;
}
最后返回的结果是根节点的head;
所以要获得头结点就必须向前遍历:
public static void main(String[] args){
Node node=level_print.change_Linkedlist(level_print.head);
if(node==null){
System.out.println("NULL");
}
else{
while(node.left!=null){
node=node.left;
}
while(node!=null){
System.out.print(node.data);
node=node.right;
}
}
}
最近自己复习写了一种比较好理解的代码
//二叉树转换成双向链表
public void InvertToLinkedlist(Node head ){
if(head.left!=null){
InvertToLinkedlist(head.left);
//寻找左子树的最大节点
Node left=head.left;
while(left.right!=null){
left=left.right;
}
//双链表的连接
left.right=head;
head.left=left;
}
if(head.right!=null){
InvertToLinkedlist(head.right);
//寻找右子树的最小节点
Node right=head.right;
while(right.left!=null){
right=right.left;
}
//双链表的连接
right.left=head;
head.right=right;
}
}