词条 | Threaded binary tree | ||||||||||||||||||||||||||
释义 |
In computing, a threaded binary tree is a binary tree variant that facilitates traversal in a particular order (often the same order already defined for the tree). An entire binary sort tree can be easily traversed in order of the main key, but given only a pointer to a node, finding the node which comes next may be slow or impossible. For example, leaf nodes by definition have no descendants, so no other node can be reached given only a pointer to a leaf node -- of course that includes the desired "next" node. A threaded tree adds extra information in some or all nodes, so the "next" node can be found quickly. It can also be traversed without recursion and the extra storage (proportional to the tree's depth) that requires. DefinitionA threaded binary tree defined as follows:
This definition assumes the traversal order is the same as in-order traversal of the tree. However, pointers can instead (or in addition) be added to tree nodes, rather than replacing existing nulls. The linked lists thus defined are also commonly called "threads", and can be used to enable traversal in any order(s) desired. For example, a tree whose nodes represent information about people might be sorted by name, but have extra threads allowing quick traversal in order of birth date, weight, or any other known characteristic. MotivationTrees, including (but not limited to) binary search trees, can be used to store items in a particular order, such as the value of some property stored in each node, often called a key. One useful operation on such a tree is traversal: visiting all the items in order of the key. A simple recursive traversal algorithm that visits each node of a BST is the following. Assume {{mvar|t}} is a pointer to a node, or {{math|nil}}. "Visiting" {{mvar|t}} can mean performing any action on the node {{mvar|t}} or its contents. {{framebox|blue}} Algorithm traverse({{mvar|t}}):
One problem with this algorithm is that, because of its recursion, it uses stack space proportional to the height of a tree. If the tree is fairly balanced, this amounts to {{math|O(log n)}} space for a tree containing {{mvar|n}} elements. In the worst case, when the tree takes the form of a chain, the height of the tree is {{mvar|n}} so the algorithm takes {{math|O(n)}} space. A second problem is that all traversals must begin at the root when nodes have pointers only to their children. It is common to have a pointer to a particular node, but that is not sufficient to get back to the rest of the tree unless extra information is added, such as thread pointers. In this approach, it may not be possible to tell whether the left and/or right pointers in a given node actually point to children, or are a consequence of threading. If the distinction is necessary, adding a single bit to each node is enough to record it. In 1968, Donald Knuth asked whether a non-recursive algorithm for in-order traversal exists, that uses no stack and leaves the tree unmodified. One of the solutions to this problem is tree threading, presented by J. H. Morris in 1979.[2][3] Relation to Parent pointersAnother way to achieve similar goals is to include a pointer in every node, to that node's parent node. Given that, the "next" node can always be reached. "right" pointers are still null whenever there are no right children. To find the "next" node from a node whose right pointer is null, walk up through "parent" pointers until reaching a node whose right pointer is not null, and is not the child you just came up from. That node is the "next" node, and after it come its descendants on the right. It is also possible to discover the parent of a node from a threaded binary tree, without explicit use of parent pointers or a stack, although it is slower. To see this, consider a node k with right child r. Then the left pointer of r must be either a child or a thread back to k. In the case that r has a left child, that left child must in turn have either a left child of its own or a thread back to k, and so on for all successive left children. So by following the chain of left pointers from r, we will eventually find a thread pointing back to k. The situation is symmetrically similar when q is the left child of p—we can follow q's right children to a thread pointing ahead to p. Types of threaded binary trees
In Python: The array of Inorder traversalThreads are reference to the predecessors and successors of the node according to an inorder traversal. Inorder of the threaded tree is ABCDEFGHI, the predecessor of E is D, the successor of E is F. ExampleLet's make the Threaded Binary tree out of a normal binary tree The INORDER traversal for the above tree is—D B A E C. So, the respective Threaded Binary tree will be -- Null linkIn an m-way threaded binary tree with n nodes, there are n*m - (n-1) void links. Non recursive Inorder traversal for a Threaded Binary TreeAs this is a non-recursive method for traversal, it has to be an iterative procedure; meaning, all the steps for the traversal of a node have to be under a loop so that the same can be applied to all the nodes in the tree. We will consider the INORDER traversal again. Here, for every node, we'll visit the left sub-tree (if it exists) first (if and only if we haven't visited it earlier); then we visit (i.e. print its value, in our case) the node itself and then the right sub-tree (if it exists). If the right sub-tree is not there, we check for the threaded link and make the threaded node the current node in consideration. Please, follow the example given below. AlgorithmStep-1: For the current node check whether it has a left child which is not there in the visited list. If it has then go to step-2 or else step-3. Step-2: Put that left child in the list of visited nodes and make it your current node in consideration. Go to step-6 Step-3: Print the node and If the node has the right child then go to step 4 else go to step 5 Step-4: Make the right child as the current node. Step-5: if there is a thread node then make it the current node. Step-6: if all nodes have been printed then END else go to step 1
References1. ^Van Wyk, Christopher J. Data Structures and C Programs, Addison-Wesley, 1988, p. 175. {{ISBN|978-0-201-16116-8}}. 2. ^{{Cite journal | doi = 10.1016/0020-0190(79)90068-1| title = Traversing binary trees simply and cheaply| journal = Information Processing Letters| volume = 9| issue = 5| year = 1979| last1 = Morris | first1 = Joseph H.}} 3. ^{{cite journal |title=Morris' tree traversal algorithm reconsidered |first1=Prabhaker |last1=Mateti and |first2=Ravi |last2=Manghirmalani |year=1988 |journal=Science of Computer Programming |volume=11 |pages=29–43 |doi=10.1016/0167-6423(88)90063-9}} External links
3 : Articles with example Python code|Binary trees|Search trees |
||||||||||||||||||||||||||
随便看 |
|
开放百科全书收录14589846条英语、德语、日语等多语种百科知识,基本涵盖了大多数领域的百科知识,是一部内容自由、开放的电子版国际百科全书。