zoukankan      html  css  js  c++  java
  • 剑指Offer之二叉搜索树与双向链表

    题目描述

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

    基本思路

      假设二叉搜索树为{10,6,14,4,8,12,16},按照中序遍历,当我们遍历转换到根节点(值为10的节点)时,它的左子树已经转换成一个排序的链表了,并且处在链表的最后一个节点是当前最大的节点。我们把值为8的节点和根节点链接起来,此时链表中的最后一个节点就是10了。接着我们去遍历转换右子树,并把根节点和右子树的最小的节点链接起来。转换左子树和右子树,使用递归的方法。

    Java代码

    package com.swordOffer.convertBinarySearchTree18;
    
    /**
     * Created by Feng on 2017/5/15.
     * 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。
     * 要求不能创建任何新的结点,只能调整树中结点指针的指向。
     */
    public class ConvertBinarySearchTree {
        public static void main(String[] args) {
    
            TreeNode node1 = new TreeNode(10);
            TreeNode node2 = new TreeNode(6);
            TreeNode node3 = new TreeNode(14);
            TreeNode node4 = new TreeNode(4);
            TreeNode node5 = new TreeNode(8);
    
            node1.left = node2;
            node1.right = node3;
            node2.left = node4;
            node2.right = node5;
    
            TreeNode result = convertNode(node1);
            System.out.println(result.val);
    
        }
    
        public static TreeNode convertNode(TreeNode pRootOfTree) {
    
            //如果根节点为空,返回空
            if (pRootOfTree == null) {
                return null;
            }
    
            //如果只有根节点
            if (pRootOfTree.left == null && pRootOfTree.right == null) {
                return pRootOfTree;
            }
    
            //转换左子树
            TreeNode pLeft = convertNode(pRootOfTree.left);
            TreeNode pNode = pLeft;
            while (pNode != null && pNode.right != null) {
                pNode = pNode.right;
            }
            if (pLeft != null) {
                pNode.right = pRootOfTree;
                pRootOfTree.left = pNode;
            }
    
            //转换右子树
            TreeNode pRight = convertNode(pRootOfTree.right);
            if (pRight != null) {
                pRootOfTree.right = pRight;
                pRight.left = pRootOfTree;
            }
    
            return pLeft != null ? pLeft : pRootOfTree;
    
        }
    
    }
    
    class TreeNode {
        int val = 0;
        TreeNode left = null;
        TreeNode right = null;
    
        public TreeNode(int val) {
            this.val = val;
    
        }
    }
  • 相关阅读:
    如何使用Oracle的Decode函数进行多值判断
    EXP/IMP 命令参数【转】
    EXISTS 的語法【转】
    Oracle10g SQL tune adviser简单介绍【转自ITPUB zhouwf0726】
    EXPDP/IMPDP 参数中文解释【转】
    oracle 中spfile和pfile简介【转自 henli 】
    Oracle NUMBER类型细讲
    ASP.NET的gridview设置数据格式(DataFormatString="{}")与 String.Format 使用总结 .
    asp.net更改文件夹名称及新建文件夹及删除文件夹
    Decimal转换成¥:123.00格式后再转换成Decimal格式的方法
  • 原文地址:https://www.cnblogs.com/lfeng1205/p/6858431.html
Copyright © 2011-2022 走看看