剑指 Offer 36. 二叉搜索树与双向链表 + 中序遍历 + 二叉排序树

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

Offer_36

题目描述

题解分析

  1. 本题考查的是二叉树的中序遍历以及二叉排序树的特征(二叉排序树的中序遍历序列是升序序列)
  2. 利用排序二叉树中序遍历的性质,可以设置一个前置指针和当前指针。
  3. 再遍历完当前结点的所有左子树后,可以得到一个数据值仅次与当前结点的结点,这个结点就是当前结点的前置结点。
  4. 然后修改前置结点的后置结点为当前结点。

java代码:

package com.walegarrett.offer;

/**
 * @Author WaleGarrett
 * @Date 2021/2/3 23:11
 */

/**
 * 题目解析:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。
 * 分析:注意题目中的二叉树是一颗搜索二叉树。
 *
 */
public class Offer_36 {
    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;
        }
    };
    Node pre,head;
    public Node treeToDoublyList(Node root) {
        if(root == null)
            return null;
        dfs(root);
        //修改头尾结点的指针
        head.left = pre;
        pre.right = head;
        return head;
    }
    void dfs(Node now){
        if(now == null)
            return;
        dfs(now.left);
        //待左子树遍历结束后,pre表示仅次于now值的结点
        if(pre == null)
            head = now;//当前结点为头结点
        else pre.right = now;//修改后置指针
        //修改前置指针
        now.left = pre;
        pre = now;
        dfs(now.right);
    }
}

posted @ 2021-02-04 23:01  Garrett_Wale  阅读(73)  评论(0编辑  收藏  举报