Given a binary tree, return the inorder traversal of its nodes' values.
For example:
Given binary tree [1,null,2,3]
,
1 \ 2 / 3
return [1,3,2]
.
Note: Recursive solution is trivial, could you do it iteratively?
The first method to solve this problem is using recursion.\nThis is the classical method and is straightforward. We can define a helper function to implement recursion.
\n\nComplexity Analysis
\nTime complexity : . The time complexity is because the recursive function is .
\nSpace complexity : The worst case space required is , and in the average case it\'s where is number of nodes.
\nThe strategy is very similiar to the first method, the different is using stack.
\nHere is an illustration:
\n!?!../Documents/94_Binary.json:1000,563!?!
\n\nComplexity Analysis
\nTime complexity : .
\nSpace complexity : .
\nIn this method, we have to use a new data structure-Threaded Binary Tree, and the strategy is as follows:
\n\n\nStep 1: Initialize current as root
\nStep 2: While current is not NULL,
\nIf current does not have left child
\na. Add current\xe2\x80\x99s value
\nb. Go to the right, i.e., current = current.right
\nElse
\na. In current\'s left subtree, make current the right child of the rightmost node
\nb. Go to this left child, i.e., current = current.left
\n
For Example:
\n1\n / \\\n 2 3\n / \\ /\n 4 5 6\n
First, 1 is the root, so initialize 1 as current, 1 has left child which is 2, the current\'s left subtree is
\n2\n / \\\n 4 5\n
So in this subtree, the rightmost node is 5, then make the current(1) as the right child of 5. Set current = cuurent.left (current = 2).\nThe tree now looks like:
\n2\n / \\\n 4 5\n \\\n 1\n \\\n 3\n /\n 6\n
For current 2, which has left child 4, we can continue with thesame process as we did above
\n4\n \\\n 2\n \\\n 5\n \\\n 1\n \\\n 3\n /\n 6\n
then add 4 because it has no left child, then add 2, 5, 1, 3 one by one, for node 3 which has left child 6, do the same as above.\nFinally, the inorder taversal is [4,2,5,1,6,3].
\nFor more details, please check \nThreaded binary tree and \nExplaination of Morris Method
\n\nComplexity Analysis
\nTime complexity : . To prove that the time complexity is ,\nthe biggest problem lies in finding the time complexity of finding the predecessor nodes of all the nodes in the binary tree.\nIntuitively, the complexity is , because to find the predecessor node for a single node related to the height of the tree.\nBut in fact, finding the predecessor nodes for all nodes only needs time. Because a binary Tree with nodes has edges, the whole processing for each edges up to 2 times, one is to locate a node, and the other is to find the predecessor node.\nSo the complexity is .
\nSpace complexity : . Arraylist of size is used.
\nAnalysis written by: @monkeykingyan
\n