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;
    
        }
    }
  • 相关阅读:
    jquery操作删除元素
    js添加页面元素
    jQuery方法
    form表单的几种提交方式
    Comparable和Comparator
    快速失败和安全失败
    Junit 测试基础
    Spring 之AOP 面向切面编程
    spring 的核心接口
    Nginx
  • 原文地址:https://www.cnblogs.com/lfeng1205/p/6858431.html
Copyright © 2011-2022 走看看