剑指 Offer 36. 二叉搜索树与双向链表

题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。

排序    节点从小到大排序,中序遍历节点
双向链表  当前节点和前一个节点    tail.right=cur  cur.left=tail
循环链表  设置链表的头结点和尾节点  head.right=tail tail.left=head

代码实现:

public class Test30 {

    /** 定义双向链表的头结点和尾节点 */
    Node head;
    Node tail;

    /** 二叉树的节点 */
    static class Node {
        public int val;
        public Node left;
        public Node right;

        public Node() {}

        public Node(int _val) {
            val = _val;
        }

        public Node(int _val,Node _left,Node _right) {
            val = _val;
            left = _left;
            right = _right;
        }
    };

    /**
     * @Description: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。
     * 要求不能创建任何新的节点,只能调整树中节点指针的指向。
     * 排序    节点从小到大排序,中序遍历节点
     * 双向链表  当前节点和前一个节点    tail.right=cur  cur.left=tail
     * 循环链表  设置链表的头结点和尾节点  head.right=tail tail.left=head
     * @Date: 2020/6/19 19:52
     * @Author: fuGuoWen
     * @Return Test30.Node 双向链表的头结点
     * @Throws
     */
    public  Node treeToDoublyList(Node root) {
        if(root==null){
            return null;
        }
        dfs(root);
        head.left=tail;
        tail.right=head;
        return head;
    }

    /**
     * @Description: 中序遍历二叉树
     * @param cur 当前节点
     * @Date: 2020/6/19 20:43
     * @Author: fuGuoWen
     * @Return 无
     * @Throws 无
     */
    public void dfs(Node cur){
        if(cur==null){
            return ;
        }
        dfs(cur.left);
        /**
         *  判断尾结点是否为空
         *  尾结点不为空,把当前节点链到链表的末尾,tail 向后移动
         *  如果尾节点为空,头节点和尾节点都指向当前元素
         * */
        if(tail!=null){
            tail.right=cur;
            cur.left=tail;
            tail=cur;
        }else{
            head=cur;
            tail=cur;
        }
        dfs(cur.right);

    }


}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章