From: Lars Magne Ingebrigtsen Date: Wed, 1 Dec 2010 22:46:22 +0000 (+0100) Subject: Reimplement extraction as O(n). X-Git-Url: https://cgit.sxemacs.org/?a=commitdiff_plain;h=15f97ee1acd27642111bda662bf7349c179c8c74;hp=cf921eefab289bcd8603465b8d8f237167f42aff;p=gnus Reimplement extraction as O(n). --- diff --git a/lisp/rtree.el b/lisp/rtree.el index 87558d7ce..094a8fc3a 100644 --- a/lisp/rtree.el +++ b/lisp/rtree.el @@ -111,15 +111,23 @@ (defun rtree-extract (tree) "Convert TREE to range form." - (nconc (and (rtree-left tree) - (rtree-extract (rtree-left tree))) - (list - (if (= (rtree-low tree) - (rtree-high tree)) - (rtree-low tree) - (rtree-range tree))) - (and (rtree-right tree) - (rtree-extract (rtree-right tree))))) + (let ((stack (list tree)) + result) + (while stack + (setq tree (pop stack)) + (while (rtree-right tree) + (push tree stack) + (let ((a (rtree-right tree))) + (rtree-set-right tree nil) + (setq tree a))) + (push (if (= (rtree-low tree) + (rtree-high tree)) + (rtree-low tree) + (rtree-range tree)) + result) + (when (rtree-left tree) + (push (rtree-left tree) stack))) + result)) (provide 'rtree)