package Tree;
import java.util.LinkedList;
import java.util.Stack;
public class TreeToDoubleList{
/**
* 把一棵搜索二叉树展开为一棵有序双向链表
* 因为二叉树节点和双向链表的节点是一样的,都是一个值+两个指针,在展开的过程时把树的左孩子节点作为last节点,
* 右孩子节点作为next节点
* 遍历保存
* 注意是把二叉树改成双向链表,而不是重建一个双向链表
*/
public static Node treeToDoubleList(Node root){
if(root == null){
return null;
}
Stack<Node> stack = new Stack<>();
LinkedList<Node> queue = new LinkedList<>();
Node node = root;
while(node != null){
while (node != null) {
stack.push(node);
node = node.left;
}
while (!stack.empty() && node == null) {
node = stack.pop();
queue.add(node);
node = node.right;
}
}
Node head = null, tail = null;
while(!queue.isEmpty()){
Node tmp = queue.poll();
if(head == null){
head = tmp;
tail = tmp;
head.left = null;
tail.right = null;
}else{
tail.right = tmp;
tmp.left = tail;
tail = tmp;
tail.right = null;
}
}
return head;
}
public static void main(String[] args){
Node node1 = new Node(1);
Node node2 = new Node(2);
Node node3 = new Node(3);
node2.left= node1;
node2.right = node3;
Node newHead = treeToDoubleList(node2);
while(newHead != null){
System.out.print(newHead.value + " ");
newHead = newHead.right;
}
System.out.println();
}
}
将一个搜索二叉树展开为一个双向链表:
方法一:非递归方法,中序遍历搜索二叉树,用队列保存,然后从队列弹出再进行重建。
方法二、递归方法,对左右子树分别调用递归函数,返回值是一个双向链表,如何表征一个双向链表,头尾节点。