• 面试题27 : BST转成双向链表


    标签: 算法


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

    思路

    1. 二叉搜索树的特性是,其中序遍历是有序的,同时左子树的元素都比根结点小,右子树的元素都比根节点大。
    2. 由上述特性可知,把二叉搜索树转换成双向链表后,根节点的前一个元素是左子树的最右边结点,根结点的后一个元素是右子树的最左边结点。
    3. 左子树和右子树的转换过程是一样的,所以是一个递归的过程。
    4. 注意,转换后返回的是指向双向链表的头指针。
    public class Solution {
        public TreeNode Convert(TreeNode pRootOfTree) {
            // 根节点为空
            if(pRootOfTree == null) return null;
            
            if(pRootOfTree.left != null){
                // 先转换左子树,获得转换后的头指针
                TreeNode left = Convert(pRootOfTree.left);
                
                // 获得指向左子树的最后一个元素的指针
                while(left.right != null) left = left.right;
                
                // 与root链接,注意双向
                pRootOfTree.left = left;
                left.right = pRootOfTree;
            }
            
            if(pRootOfTree.right != null){
                // 同理,转换右子树
                TreeNode right = Convert(pRootOfTree.right);
                
                // 获得指向右子树的第一个元素的指针,这里直接就是right,与root双向链接
                pRootOfTree.right = right;
                right.left = pRootOfTree;
            }
            
            // 最后把pRootOfTree指向双向链表的第一个元素再返回
            while(pRootOfTree.left != null){
                pRootOfTree = pRootOfTree.left;
            }
            
            return pRootOfTree;
        }
    }
    
  • 相关阅读:
    (转)SpringMVC学习总结
    Golang-函数的defer
    Golang-闭包
    Golang-匿名函数
    Golang-init()
    Golang-递归
    Golang-函数、包、变量的作用域
    Golang-for、break、continue、goto、return
    Golang-程序流程控制 if、switch
    Golang-进制、源码反码补码、位运算
  • 原文地址:https://www.cnblogs.com/banyu/p/6649507.html
Copyright © 2020-2023  润新知