把一个搜索二叉树展开为一个双向链表

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();

     }




}

将一个搜索二叉树展开为一个双向链表:

方法一:非递归方法,中序遍历搜索二叉树,用队列保存,然后从队列弹出再进行重建。

方法二、递归方法,对左右子树分别调用递归函数,返回值是一个双向链表,如何表征一个双向链表,头尾节点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值