剑指 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 @   Garrett_Wale  阅读(76)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
点击右上角即可分享
微信分享提示