You would use the output of your tree traverse function and construct the tree next time with your corresponding constructor from same traversal order. Also you could name the nodes and list the children of each node and identify the top node (say the first one in the list). This is generally considered more practical way for trees than actual concreate linked structure (in addition of the adjacency matrix, which you also can use to save, but it is highly redundant and sparse).
Now, how can i save the binary tree onto the hard disk, and how can i rebuild it from the hard disk ?
Well, obviously you need to devise some kind of format, but the easiest method is with record ordering. You can treat serialization as an extension of copying, where a pre-order traversal is the way to go:
How does the method described by you handle the case when the binary tree is not complete
As long as the original tree is a valid binary search tree, the restored tree will be an exact copy. The down side of this method is reconstructing the tree is O(N log N) because it reuses the insert operation. There are ways around that, but it's not as concise.
For Each ctrl As Control In Me.Controls("pnlMainPanel").Controls
If ctrl.GetType Is GetType(System.Windows.Forms.Panel) Then
For Each subCtrl As Control In ctrl.Controls
If subCtrl.GetType Is GetType(System.Windows.Forms.TextBox) Then
If subCtrl.GetType Is ...