首页 > 编程语言 > 详细

《剑指offer》面试题27 二叉搜索树与双向链表 Java版

时间:2019-10-16 18:11:21      阅读:63      评论:0      收藏:0      [点我收藏+]

(将BST改成排序的双向链表。)

我的方法一:根据BST的性质,如果我们中序遍历BST,将会得到一个从小到大排序的序列。如果我们将包含这些数字的节点连接起来,就形成了一个链表,形成双向链表也很简单。关键是我们要知道我们在准备连接一个节点时,我们要知道它之前处理的那个节点,也就是小于它的最大一个节点。如果用迭代的方法,这个信息是丢失的,所以我们要用一个变量保存这个节点。下面是中序遍历的迭代方法,处理的过程变成了连接,处理完后更新lasthandle。

        public TreeNode build(TreeNode root){
            if(root == null)return null;
            TreeNode rootMark = root;
            Stack<TreeNode> stack = new Stack<>();
            TreeNode lasthandle = null;
            
            while(root != null || stack.size()>0){
                while(root != null){
                    stack.push(root);
                    root = root.left;
                }
                if(stack.size()>0){
                    root = stack.pop();
                  
                     //开始处理
                    root.left = lasthandle;
                    if(lasthandle != null){
                        lasthandle.right = root;
                    }
                     //更新
                    lasthandle = root;
                
                     root = root.right;
                }
            }
            
            //返回头节点
            root = rootMark;
            while(root.left != null){
                root = root.left;
            }
            return root;
        }

我的方法二:也可以采用递归的方法,我们利用递归函数的返回值返回处理好的双向链表的头节点,同时利用一个lastHandle变量保存上一次处理的节点(这个值会在递归函数中更新),这样我们就可以很方便地在递归的中序遍历中进行连接操作了。(但是一直没测试通过,应该是算法出了问题)

《剑指offer》面试题27 二叉搜索树与双向链表 Java版

原文:https://www.cnblogs.com/czjk/p/11686875.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!