Complete Binary Tree Illustration Question

Hello I am trying to illustrate the following integers as a complete binary tree:
20, 12, 17, 36, 25, 49, 52, 65, 42, 35, 71, 43, 54
I wanted to ask if in inorder to create the complete binary tree, do I need to start in the very middle (52) then half the left and right side and continue this process until complete? eg:
52
36 71
Or do I start from the begining of the array, as below:
20
12 36
17

Thanks for the answers guys!
Paul based on what you said, does this then look correct to you or have I got the wrong idea?:
                                              20
                                  12                        36
                                        17          25              49
                                                          35      42     52
                                                                       43      65
                                                                            54       71

Similar Messages

  • Adding to a Linked Complete Binary Tree

    Hi all,
    I am having major trouble trying to grasp the concept behind adding to a Complete Binary Tree (linked structure). It is part of a much larger assignment that uses a Heap Priority Queue and I am genuinely stuck. I have noticed that there seems to be some sort of strike going on so I wont expect a reply to this.
    I understand that Binary Tree's are useful because of their recursive nature, does the process of adding use recursion also. My mind is a mess at the moment so forgive the rambling. My problem exists when I go to add after a right child on a lower level(anything below level 3). I have come to the conclusion that I it is impossible to continue with my adding method and that I should scrap it. Can anyone point anything relevant out to me? I'd appreciate it, thank you.
    public class LinkedBT implements CompleteBT
         private BTNode root;          //a reference to the root node
         private BTNode current;          //a reference to the last inserted node
         private BTNode firstNodeInLevel; //a reference to the first node in the level
         private int size;               //keeps track of the size of the BT
         private int currentLevel;
         private int leafCount;
         public LinkedBT()
              root = null;     //instantiate instance variables
              current = null;
              size = 0;
              currentLevel = 0;     //indicates that there are no nodes
              leafCount = 0;
              firstNodeInLevel = null;
         public boolean isEmpty()     
              return (root==null);
         public int size()
              return size;
         public void add(Object obj, int priority)
              BTNode tempNode = new BTNode(obj, priority);
              tempNode.parent = current;                                   //set the parent of the node to current
              if(isEmpty())                                             //if the tree is empty then make a new BTNode and give it the root reference
                   root = tempNode;     
                   current = root;                                        //make current reference to the root node
                   size++;
                   currentLevel++;                //increments currentLevel
                   return;                          //return control to calling method
              if(current.childrenFull!=true)          //if the current node has available children positions then check left and right and add BTNode appropriately
                   if(current.leftChild==null)
                        if(leafCount==0)     //if this is the first node to be added on any given level then.....
                             firstNodeInLevel = tempNode;     //.....store a reference to it for future adding purposes
                        current.leftChild = tempNode;     //adds BTNode to left child
                        leafCount++;
                   else
                        current.rightChild = tempNode;          //add BTNode to right child
                        leafCount++;
                        current.childrenFull = true;          //after adding the right child set the childrenFull property true NECESSARY?????
                        if(Math.pow(2, currentLevel)==leafCount)     //IF THIS EVALS TO TRUE THEN THE MAX NUMBER OF LEAVES FOR THAT LEVEL IS REACHED
                             currentLevel++;     //increment the level
                             leafCount = 0;     //reset the leaf count
                             current = firstNodeInLevel;          //change current to the furthest leaf on the left
                        else     //ELSE NEED TO GO BACK UP AND FIND NEXT FEASIBLE POSITION
                             //while(current.parent.rightChild.leftChild.)----------------THIS DOESNT WORK WHEN THE TREE GETS BIGGER
                                  //current = current.parent; //set current to next feasible position
              size++;
         public Object getRoot()
              return root;
         public void heapSort()
         private class BTNode
              private Object value;
              private int key;
              private BTNode parent;
              private BTNode leftChild;
              private BTNode rightChild;
              private boolean childrenFull;      //initially false, when both children are occupied then change to true
              private BTNode(Object obj, int priority)     //constructor accepts the value and the priority key
                   value = obj;          
                   key = priority;
                   parent = null;
                   leftChild = null;
                   rightChild = null;
                   childrenFull = false;
              public boolean hasNoChildren()
                   return(leftChild==null && rightChild==null);     //returns true if the node has no children
    }

    Currently working on setting the Linked Servers Security properties. Added the SQLAgent in the" Local server login to remote server login mappings:". The SQLAgent is the only entry in the grid. The SQLAgent has the Remote User and Remote Password
    of the AS400. Then below have "Not be made" for "For a login not defined in the lst above, connections will:".
    So provided that the SQL Admin only gives SQL Job create, Job Alter and Alter Linked Server to user/groups that he wants to use the linked server the Admin can control access to the linked server.
    Any thoughts?

  • How to remember the path while traverse a binary tree?

    Hi, again, I have difficulty handling tree search problems.
    The quesion is How to search for a node from a binary tree A, return true if found meanwhile generate the path which can be used to locate the node.
    I think the signature should be:
    // The path contains only 0s and 1s. 0 means go left and 1 means go right.
    public staic boolean search(Node rootOfA, Node b, ArrayList<Integer> path){
    // the class Node only has two fields:
    Node{
    Node left;
    Node right;
    I know if there is another field in the Node class (say, a flag), the quesion would be much easier, but the space is really critical.
    I tried to use recursion but havn't got a correct solution. I am thinking of usinga non-recursion algo.
    Anyone wants to help?

    Hi, JosAh,
    That's mind provoking. However, I do think it works. It does not pop some stuff it should pop. I tested it over a very simple tree and it failed. Did you test it? I might be wrong...
    The tree I am working on does not have null pointers, the condition to test if a node is a leaf is if(node.right == right). Namly, all the right pointer of leaves points to itself.
    So I changed your code to be:
    Stack search(Node root, Node node, Stack<Integer> path) {
         if (root == null || root.right ==right) return null;
         if (root.equals(node)) return path;
         path.push(0);
    if (search(root.left, node, path) != null) return path;
    path.pop();
    path.push(1);
    return search(root.right, node, path);
    }I simply tested it with
    Stack<Integer> path = new Stack<Integer>();
    System.out.println( root, root.right.right, path);
    root is the root of a complete binary tree with 7 nodes(4 leaves).
    Apparenly, if the path is built correctly search(root, root.right.right, path) would return [1,1] whereas this seach returns [ 0 , 1, 1].
    Considerring , the right branch never pops, I changed it into
    Then I changed it to :
    Stack search(Node root, Node node, Stack<Integer> path) {
         if (root == null || root.right ==right ) return null;
         if (root.equals(node)) return path;
         path.push(0);
    if (search(root.left, node, path) != null) return path;
    path.pop();
    path.push(1);
    if (search(root.right, node, path) != null) return path;
    path.pop();
    return path;
    With the same test case, it returns [].
    I will keep working on it.
    Cheers,
    Message was edited by:
    since81
    Message was edited by:
    since81

  • Binary Tree Question

    Ok, I am making a binary tree. I have a question for my insert method. Firstly, I can't find out why the root node is inserted more than once in the tree. Also, I am having trouble with connecting the nodes that I insert to the tree. I can attach modes to root just fine, but I can't find out how to attach nodes to the existing nodes that are already attached to the tree. When I insert a node that meets the criteria of an already existing node, it replaces the node instead of getting attached to it. The answer is probably trivial, but I can't find it. Here is my insert method.
    public void insert(T obj) {
              int _result1;
              int _result2;
           //TODO: Implement Q1 here
              if(isEmpty() == true){
                   _root = createNode(obj, null, null, null);
                   System.out.println("The root inserted is " + _root.element());
                   insert(obj);
              _node = createNode(obj, _root, null, null);
              _result1 = _node.element().compareTo(_root.element());
              if(_result1 < 0){
                        if(_node.isInternal() == true){
                             _current = (BTreeNode<T>) _node2.element();
                             _result2 = _current.element().compareTo(_current.getParent().element());
                             //System.out.println("The current element is " + _current.element());
                             if(_result2 < 0){
                                  _node1.getLeft();
                                  _current = _node1.getLeft();
                             else{
                                  _node1.getRight();
                                  _current = _node1.getRight();
                             if(_node1.hasLeft() == true){
                                  _node1.getLeft();
                                  _current = _node1.getLeft();
                             else{
                                  _current.setLeft(_node1);
                                  _current = _node2;
                        else{
                             _node1 = createNode(obj, _node, null, null);
                             _node.setLeft(_node1);
                             _node1.setParent(_node);
                             System.out.println("The parent of the left node " + _node.element() + " is " + _node.getParent().element());
                             _root.setLeft(_node1);
                             _current = _node1;
                             //System.out.println("The current element is " + _node.element());
              else{
                        if(_node.isInternal() == true){
                             _current = (BTreeNode<T>) _current.element();
                             _result2 = _current.element().compareTo(_current.getParent().element());
                             //System.out.println("The current element is " +_current.element());
                             if(_result2 < 0){
                                  _node1.getLeft();
                                  _current = _node1.getLeft();
                             else{
                                  _node1.getRight();
                                  _current = _node1.getRight();
                             if(_node1.hasRight() == true){
                                  _node1.getRight();
                                  _current = _node1.getRight();
                             else{
                                  _current.setLeft(_node1);
                                  _current = _node1;
                   else{
                        _node1 = createNode(obj, _node, null, null);
                        _node.setRight(_node1);
                        _node1.setParent(_node);
                        //_current = _node1;
                        System.out.println("The parent of the right node " + _node.element() + " is " + _node.getParent().element());
                        _root.setRight(_node1);
                        _current = _node1;                         
                        //System.out.println("The current element is " + _current.element());
              }The output I get is:
    The root inserted is 6
    The parent of the right node 6 is 6
    The parent of the right node 6 is 6 ** I can't figure out why the root is inserted two extra times**
    The parent of the left node 3 is 6
    The parent of the right node 11 is 6
    The parent of the right node 12 is 6 ** this node should be attaching to 11 instead of replacing it **
    The parent of the right node 8 is 6
    The parent of the right node 9 is 6
    The parent of the right node 10 is 6
    The parent of the right node 7 is 6
    preorder :(6 (3 )(7 ))
    postorder:(( 3) ( 7) 6)

    IMO, your insert method is way too complicated.
    Have a look at this pseudo code: that's all it takes to insert nodes in a BT:
    class Tree<T extends Comparable<T>> {
        private Node root;
        public void insert(T obj) {
            'newNode' <- a new Node('obj') instance
            IF 'root' equals null
                let 'root' be the 'newNode'
            ELSE
                insert('root', 'newNode')
            END IF
        public void insert(Node parent, Node newNode) {
            IF 'parent' is less than 'newNode'
                IF the left child of 'parent' is null
                    let 'newNode' be the left child of 'parent'
                ELSE
                    make a recursive call here: insert('???', 'newNode')
                END IF
            ELSE
                IF the right child of 'parent' is null
                    let 'newNode' be the right child of 'parent'
                ELSE
                    make a recursive call here: insert('???', 'newNode')
                END IF
            END IF
    }

  • Searching for a certain  binary tree from another tree........

    I have been struggling for a tree search problem for a good while. Now I decide to ask you experts for a better solution :-).
    Given a binary tree A. We know that every Node of A has two pointers. Leaves of A can be tested by if(node.right = =node). Namely, The right pointer of every leaf node points to itself. (The left pointer points to the node sits on the left side of the leaf in the same depth. and the leafmost node points to the root. I do no think this information is important, am i right?).
    Tree B has a similar structure.
    The node used for both A and B.
    Node{
    Node left;
    Node right;
    My question is how to test if tree B is a subtree of A and if it is, returns the node in A that corresponds to the root of B. otherwise, return null.
    So, the method should look like:
    public Node search(Node rootOfA, Node rootOfB){
    I know a simple recursive fuction can do the job. The question is all about the effciency....
    I am wonderring if this is some kind of well-researched problem and if there has been a classical solution.
    Anyone knows of that? Any friend can give a sound solution?
    Thank you all in advance.
    Jason
    Message was edited by:
    since81

    I'm not too sure if this would help but there goes.
    I think a recursive function will be the easiest to implement (but not the most efficient). In terms of recursive function if you really want to add performance. You could implement your own stack and replace the recursive function with the use of this stack (since really the benefit of recursive function is that it manages its own stack). A non-recursive function with customized well implemented stack will be much more efficient but your code will become more ugly too (due to so many things to keep track of).
    Is tree B a separate instance of the binary tree? If yes then how can Tree B be a subset/subtree of tree A (since they are two separate "trees" or instances of the binary tree). If you wish to compare the data /object reference of Tree B's root node to that of Tree A's then the above method would be the most efficient according to my knowledge. You might have to use a Queue but I doubt it. Stack should be able to replace your recursive function to a better more efficient subroutine but you will have to manage using your own stack (as mentioned above). Your stack will behave similar to the recursive stack to keep track of the child/descendant/parent/root node and any other references that you may use otherwise.
    :)

  • Binary Tree in Java - ******URGENT********

    HI,
    i want to represent a binary tree in java. is there any way of doing that.
    thanx
    sraphson

    HI,
    i want to represent a binary tree in java. is there
    e any way of doing that.
    thanx
    sraphsonFirst, what is a binary tree? Do you know how the binary tree looks like on puesdo code? How about a representation in terms of numbers? What is a tree? What is binary? The reason I ask is, what do you know about programming?
    Asking to represent a binary tree in java seems like a question who doesn't know how it looks like in the first please. Believe me, I am one of them. I am not at this level yet. If you are taking a class that is teaching binary trees and you don't know how it looks like, go back to your notes.
    Sounds harsh, but it is better to hear it from a person that doesn't know either then a boss that hired you because Computer Science was what you degree said. Yet, you don't know how to program?
    Telling you will not help you learn. I can show you tutorials of trees would be start on where to learn.
    HOW TO USE TREES (oops this is too simple, but it is a good example)
    http://java.sun.com/docs/books/tutorial/uiswing/components/tree.html
    CS312 Data Structures and Analysis of Algorithms
    (Here is a course about trees. Search and learn)
    http://www.calstatela.edu/faculty/jmiller6/cs312-winter2003/index.htm

  • Binary trees in Java

    Hi there
    Do you have any suggestions about how to implement trees or binary trees in Java?
    As far as I know there are already some libraries for that, but I don't know how to use them. Was trying to get some implementation examples but I'm still very confused.
    How can I use for example:
    removeChild(Tree t)
    addChild(Tree t)
    isLeaf()
    Thanks in advance

    Lulu wrote:
    Hi there
    I have several questions about binary trees
    Let's see, I use TreeMap to create them with the following code:
    TreeMap treeMap = new TreeMap<Integer, String>();
    treeMap.put("first", "Fruit");
    treeMap.put("second","Orange");
    treeMap.put("third", "Banana");
    treeMap.put("fourth", "Apple");You've defined the map to hold integer keys and strings as values, yet you're trying to add string keys and string values to it: that won't work.
    If this is a map how do I define if the data should go to the left or to the right of certain node?That is all done for you. In a TreeMap (using the no-args constructor), you can only store objects that are comparable to each other (so, they must implement the Comparable interface!). So the dirty work of deciding if the entry should be stored, or traversed, into the left or right subtree of a node, is all done behind the scenes.
    Also note that TreeMap is not backed up by a binary tree, or a binary search tree, but by a red-black tree. A red-black tree is a self balancing binary tree structure.
    Should I have dynamical keys so that they increase automatically when adding new data?
    According to a webpage I should use Comparator(), is that to find the data in the tree and retrieve the key?
    ThanksI am not sure what it is you want. I am under the impression that you have to write a binary tree (or a binary search tree) for a course for school/university. Is that correct? If so, then I don't think you're permitted to use a TreeMap, but you'll have to write your own classes.

  • Binary tree using inorder traversal algorithm

    I need to draw a Binary tree using Inorder traversal algorithm.. in java applets using rectangles and ellipse objects.. can anyone help me about this ? I will be really thankful to yu

    I think this is my psychic Sunday, so here's my attempt at answering
    this vaguely stated question. First have a look at this fine piece of
    ASCII art:--------------------------------------------   ^         ^
    | A                    T                     |   |         |
    |                                            |   |        root
    ---------L-----------------------R---------+   |         v
    | B                    |  C                  |   |
    |                      |                     |   |
    |                      |                     | height
    |                      |                     |   |
    |                      |                     |   |
    |                      |                     |   |
    |                      |                     |   |
    |                      |                     |   |
    |                      |                     |   |
    |                      |                     |   |
    -------------------------------------------+   v
    <--------------------width------------------->Suppose you have a rectangle 'width' wide and 'height' high. The root
    of the tree can be drawn at position T and (if present), two lines can be
    drawn to the positions L and R respectively. Now recursively call your
    same method using the computed rectangle A and B for the left and
    right subtrees L and R respectively.
    kind regards,
    Jos

  • Putting words from a text file into a binary tree.

    I am having problems figuring out how to do this.
    the text file will have a sentence like this
    Every one likes to play games.
    My Dog tore up my apartment last night.
    How old are you sir.I know how to put regular strings into a binary tree, but I don't know what to do in order to put these textfile strings into it.
    I thought of using string tokenizer but I couldn't get that to work because the sentences are not a specific length, they can be any length. Can somebody give me some tips on what to use?
    Thank you

    JulianJ wrote:
    That will work?I'm sorry to tell you, that is a really bad question. Of course it won't work, because you did something else wrong. I have no idea what, but it's pretty certain that you haven't got everything right yet. (And that's nothing personal, it's just an observation about computer programming in general.) But don't let that stop you. And don't wait around for people to validate your ideas. Try it and see what happens. You won't break anything. And when it doesn't work, figure out why and carry on.

  • How to make a binary tree

    i have this assignment for school. The first thing it says is: Write a binary tree class named my_Tree as the basic data structure. What does this mean? Can anyone give me an example of the java code that this should be written in?
    Also, i have to sort a sequence of numbers in increasing order. I have the command line prompt written already, but how do i sort it using if/else statements? Thanks a lot. I'm really bad at java programming.

    i dont really understand that? Im really slow at
    this. Can you clarify?Sorry. Here is a more complete implementation of a node.
    // header file for class Node
    // copywrong filestream. no rights reserved
    #ifndef _NODE_H_
    #define _NODE_H_
    class Node
       public:
          Node();
          Node(int x);
          Type getinfo();
          Node *getleft();
          Node *getright();
          void setinfo(Type x);
          void setleft(Node *n);
          void setright(Node *n);
       private:
          int info;
          Node *left;
          Node *right;
    #endif

  • Help loading a binary tree from file

    Hi all,
    So I am working on making a 20 question game using a binary tree. I have set it up so each time the user plays, if the computer cannot guess what they are thinking of, they tell the computer and it saves it. I am saving the tree in a text file recursively, in a format that looks something like this:
    Do you use it outside?
    a shovel
    [null]
    [null]
    is it round?
    a ball
    [null]
    [null]
    a TV
    [null]
    [null]
    The problem is now, I am having a very hard time rebuilding the tree when the user restarts the game. As you can see, the "{" indicates the beginning of a path and the "}" is the end. Can someone suggest a nice way to load this back up into my data structure? Thanks!!

    Cross-post here: [http://www.java-forums.org/java-2d/14237-help-loading-binary-tree-file.html]
    Recommended looking into XML

  • Deep cloning a Binary Tree

    Hi, I have a class called DigitalTree that acts like a binary tree, storing nodes that each have a "key" which is a long value, and then puts each node into the tree in its correct place, binary tree style. I am trying to deep clone the tree, but for some reason my recursive cloning method isn't working. If anyone can see a problem in my code or has any tips for me, it would be greatly appreciated. Thanks.
    public Object clone()
           DigitalTree<E> treeClone = null;
           try
               treeClone = (DigitalTree<E>)super.clone();
           catch(CloneNotSupportedException e)
               throw new Error(e.toString());
           cloneNodes(treeClone, this.root, treeClone.root);
           return treeClone;
       private void cloneNodes(DigitalTree treeClone, Node currentNode, Node cloneNode)
           if(treeClone.size == 0)
               cloneNode = null;
               cloneNodes(treeClone, currentNode.left, cloneNode.left);
               cloneNodes(treeClone, currentNode.right, cloneNode.right);
           else if(currentNode != null)
               cloneNode = (Node<E>)currentNode.clone();
               cloneNodes(treeClone, currentNode.left, cloneNode.left);
               cloneNodes(treeClone, currentNode.right, cloneNode.right);
       }In the Node class:
    public Object clone()
              Node<E> nodeClone = null;
              try
                   nodeClone = (Node<E>)super.clone();
              catch(CloneNotSupportedException e)
                   throw new Error(e.toString());
              return nodeClone;
           }

    Hello jssutton
    Your question inspired me to try my own binary tree and cloning. My cloning algorithm is similar to yours but with one difference.
    In my class Tree defined as:
    class Tree<T extends Comparable>
    I have:
        private void deepCopyLeft(TreeNode<T> src, TreeNode<T> dest) {
            if (src == null) return;
            dest.mLeft = new TreeNode<T>(src.mValue);
            deepCopyLeft(src.mLeft, dest.mLeft);
            deepCopyRight(src.mRight, dest.mLeft);
        private void deepCopyRight(TreeNode<T> src, TreeNode<T> dest) {
            if (src == null) return;
            dest.mRight = new TreeNode<T>(src.mValue);
            deepCopyLeft(src.mLeft, dest.mRight);
            deepCopyRight(src.mRight, dest.mRight);
        public Tree<T> deepCopy() {
            if (root == null) return new Tree<T>();
            TreeNode<T> newRoot = new TreeNode<T>(root.mValue);
            deepCopyLeft(root.mLeft, newRoot);
            deepCopyRight(root.mRight, newRoot);
            return new Tree<T>(newRoot);
        }Its a similar recursive idea, but with 2 extra functions. I hope that helps. I don't have time right now to pinpoint the problem in your routine. Good luck.

  • Reconstructing a Binary Tree

    Hi guys ;
    I have a BST class .One of its methods is preorder travesal.
    this method traverse theBinary tree in preorder and prints nodes data to a file.
    Now what i want to do is to be able to construct the binary tree by reading data from this file : keeping in mind the data nodes were saved to this file in preorder.
    Is this a possible thing to do ?
    How can I do this ?
    Is there a better way to save a binary tree to a file and the other way : read from file and construct the tree again?
    Many thanks for helping !

    I'd like to say thanks too.. it really helped me out!
    I used a few minutes (or so ;) to figure out the functions for saving and rebuilding the tree, so I thought I'd post it here, if anyone could use it. Note: this ugly pseudocode might look a little like VB.net-code, which happened completely by accident..
        Private Function SearchForLeaves(ByVal StartNode As Node, ByVal BitString As String) As String
            'Recursive function. If a leaf is found on left or right side of the branch,
            'then print the binary pattern used to get there, else call the function again on the next branch.
            Dim SavedTree As String
            With StartNode
                If .LeftChild.Type = NodeType.Leaf Then
                    Print .leftChild.Value & " " & Bitstring & "0"
                    SavedTree += "!" & .LeftChild.Value
                Else
                    SearchForLeaves(.LeftChild, BitString & "0")
                End If
                If .RightChild.Type = NodeType.Leaf Then
                    Print .leftChild.Value & " " & Bitstring & "1"
                    SavedTree += "!" & .RightChild.Value
                Else
                    SearchForLeaves(.RightChild, BitString & "1")
                End If
                SavedTree += "?"
            End With
            Return SavedTree
        End Function
        Private Function RebuildTree(ByVal savedTree As String) As Node
            Dim n As Node
            While Len(savedTree) > 0
                If savedTree.StartsWith("!") Then
                    CropString(savedTree)
                    n = New Node(NodeType.Leaf)
                    n.Value = CropString(savedTree)
                    Stack.Push(n)
                End If
                If savedTree.StartsWith("?") Then
                    CropString(savedTree)
                    n = New Node(NodeType.Branch)
                    n.RightChild = Stack.Pop
                    n.LeftChild = Stack.Pop
                    n.LeftChild.Parent = n
                    n.RightChild.Parent = n
                    Stack.Push(n)
                End If
            End While
            Return Stack.Pop
        End Function
        Private Function CropString(byRef cropMe as String) As String
            Dim L As String
            L = cropMe.Substring(0, 1)
            cropMe = cropMe.Substring(1)
            Return L
        End FunctionCropString just crops off and returns the first character of the string.. I'm going to rewrite this whole thing, but right now I'm just pleased I figured out how to make it work :)
    Cheers!

  • Traverse a binary tree from root to every branch

    I have a couple of other questions. I need to get all the different combinations of a binary tree and store them into a data structure. For the example in the code below, the combinations would be:
    1) Start, A1, A2, A3, B1, B2, B3
    2) Start, A1, A2, B1, A3, B2, B3
    3) Start, A1, A2, B1, B2, A3, B3
    4) Start, A1, A2, B1, B2, B3, A3
    5) Start, A1, B1, A2, A3, B2, B3
    etc.
    I understand that this is very similar to the preorder traversal, but preorder does not output the parent nodes another time when the node splits into a left and right node. Any suggestions?
    * To change this template, choose Tools | Templates
    * and open the template in the editor.
    package binarytreetest;
    import java.util.ArrayList;
    import java.util.Iterator;
    * @author vluong
    public class BinaryTreeTest {
         * @param args the command line arguments
        public static void main(String[] args) {
            // TODO code application logic here
            int countA = 0;
            int countB = 0;
            ArrayList listA = new ArrayList();
            ArrayList listB = new ArrayList();
            listA.add("A1");
            listA.add("A2");
            listA.add("A3");
            listB.add("B1");
            listB.add("B2");
            listB.add("B3");
            //listB.add("B1");
            Node root = new Node("START");
            constructTree(root, countA, countB, listA, listB);
            //printInOrder(root);
            //printFromRoot(root);
        public static class Node{
            private Node left;
            private Node right;
            private String value;
            public Node(String value){
                this.value = value;
        public static void constructTree(Node node, int countA, int countB, ArrayList listA, ArrayList listB){
            if(countA < listA.size()){
                if(node.left == null){
                    System.out.println("There is no left node. CountA is " + countA);
                    System.out.println("Created new node with value: " + listA.get(countA).toString() + " with parent, "
                            + node.value);
                    System.out.println();
                    node.left = new Node(listA.get(countA).toString()); 
                    constructTree(node.left, countA+1, countB, listA, listB);   
                }else{
                    System.out.println("There is a left node. CountA + 1 is " + countA+1);
                    constructTree(node.left, countA+1, countB, listA, listB);   
            if(countB < listB.size()){
                if(node.right == null){
                    System.out.println("There is no right node. CountB is " + countB);
                    System.out.println("Created new node with value: " + listB.get(countB).toString() + " with parent, "
                            + node.value);
                    System.out.println();
                    node.right = new Node(listB.get(countB).toString());
                    constructTree(node.right, countA, countB+1, listA, listB);
                }else{
                    System.out.println("There is a right node. CountB + 1 is " + countB+1);
                    constructTree(node.right, countA, countB+1, listA, listB);
        }My second question is, if I need to add another list (listC) and find all the combinations of List A, listB and list C, is it correct to define the node class as
    public static class Node{
            private Node left;
            private Node mid;
            private Node right;
            private String value;
            public Node(String value){
                this.value = value;
        }Node left = listA, Node mid = listB, Node right = listC
    The code for the 3 lists is below.
    3 lists (A, B, C):
    * To change this template, choose Tools | Templates
    * and open the template in the editor.
    package binarytreetest;
    import java.util.ArrayList;
    * @author vluong
    public class BinaryTreeTest {
         * @param args the command line arguments
        public static void main(String[] args) {
            // TODO code application logic here
            insert(root, "A1");
            insert(root, "A2");
            insert(root, "B1");
            insert(root, "B2"); 
            insert(root, "A2");
            int countA = 0;
            int countB = 0;
            int countC = 0;
            ArrayList listA = new ArrayList();
            ArrayList listB = new ArrayList();
            ArrayList listC = new ArrayList();
            listA.add("A1");
            listA.add("A2");
            //listA.add("A3");
            listB.add("B1");
            listB.add("B2");
            //listB.add("B3");
            //listB.add("B1");
            listC.add("C1");
            listC.add("C2");
            Node root = new Node("START");
            constructTree(root, countA, countB, countC, listA, listB, listC);
            //ConstructTree(root, countA, countB, listA, listB);
            //ConstructTree(root, countA, countB, listA, listB);
            printInOrder(root);
            //printFromRoot(root);
        public static class Node{
            private Node left;
            private Node mid;
            private Node right;
            private String value;
            public Node(String value){
                this.value = value;
        public static void constructTree(Node node, int countA, int countB, int countC, ArrayList listA, ArrayList listB, ArrayList listC){
            if(countA < listA.size()){
                if(node.left == null){
                    System.out.println("There is no left node. CountA is " + countA);
                    System.out.println("Created new node with value: " + listA.get(countA).toString() + " with parent, "
                            + node.value);
                    System.out.println();
                    node.left = new Node(listA.get(countA).toString()); 
                    constructTree(node.left, countA+1, countB, countC, listA, listB, listC);   
                }else{
                    System.out.println("There is a left node. CountA + 1 is " + countA+1);
                    constructTree(node.left, countA+1, countB, countC, listA, listB, listC);   
            if(countB < listB.size()){
                if(node.mid == null){
                    System.out.println("There is no mid node. CountB is " + countB);
                    System.out.println("Created new node with value: " + listB.get(countB).toString() + " with parent, "
                            + node.value);
                    System.out.println();
                    node.mid = new Node(listB.get(countB).toString());
                    constructTree(node.mid, countA, countB+1, countC, listA, listB, listC);
                }else{
                    System.out.println("There is a right node. CountB + 1 is " + countB+1);
                    constructTree(node.mid, countA, countB+1, countC, listA, listB, listC);
            if(countC < listC.size()){
                if(node.right == null){
                    System.out.println("There is no right node. CountC is " + countC);
                    System.out.println("Created new node with value: " + listC.get(countC).toString() + " with parent, "
                            + node.value);
                    System.out.println();
                    node.right = new Node(listC.get(countC).toString());
                    constructTree(node.right, countA, countB, countC+1, listA, listB, listC);
                }else{
                    System.out.println("There is a right node. CountC + 1 is " + countC+1);
                    constructTree(node.mid, countA, countB, countC+1, listA, listB, listC);
        }Thank you in advance!

    It looks to me like you are interleaving two lists. It looks like you are doing this while leaving the two subsequences in their original order.
    If that is in fact what you are doing, then this is just a combinatorics problem. Here is psuedo code (NOT java!)
    List path = new List();
    show(List A, int a, List B, int b, path){
      if(a >= A.length() && b >= b.length()){
        spew(path);
      } else {
        if(a < A.length()){path.push(A[a]); show(A,a+1,B,b,); path.pop();}
        if(b < B.length()){path.push(B); show(A,a,B,b+1,); path.pop();}
    show(A, 0, B, 0);
    In order to interleave 3 lists, you would add C and c arguments to the function and you would add one more line in the else block.

  • Building a binary tree from a string

    I'm having trouble building a binary tree with shape described in a string.
    00 - means both left and right subtrees are empty;
    01 - means that the left is empty, and the right is not;
    10 - right is empty, left is not
    11 - neither are empty
    public BinaryTree(String s, Iterator it) {
    This constructor is supposed to build the binary tree of the specified shape and fills it with values. THe values come from Iterator it, and are placed into the tree in preorder fashion.
    I have to complete this constructor but I don't really know what to do. I was thinking I could use indexOf somehow. Any help would be greatly appreciated.
    Thanks,
    Mike

    I'd build it like this (this is from the top of my head, so no typo-free-warranties etc.) -- public class Tree {
       private Object data;
       private Tree left= null;
       private Tree right= null;
       private Tree(StringReader sr, Iterator di) {
          char l= (char)sr.read(); // left and right subtree indicators
          char r= (char)sr.read();
          data= di.next(); // set data for this node
          if (l == '1') left= new Tree(sr, di); // build left subtree
          if (r == '1') right= new Tree(sr, di); // build right subtree
       public Tree(String s, Iterator di) {
          this(new StringReader(s), di);
    } Note that the private constructor (the one that does all the work) doesn't handle incorrect strings
    at all, i.e. it'll crash horribly when the string passes contains, say an odd number of characters
    is is simply passing incorrect construction information. Also note that the Iterator must be able
    to iterate over enough elements to be set.
    kind regards,
    Jos

Maybe you are looking for

  • Missing default filter presets in Library View [Lightroom 3.6]

    Hi there, It's my first topic on this forum. Yesterday I have installed Windows 8. At beggining everything was fine with lightroom. I have left computer turned on whole night to let lightroom generate previews to my whole collection. In the morning I

  • How to syncronise  2 cols in two different tables....

    In a form i have got 2 col EMPNO,ENATI.... EMPNO ENATI 12 02 13 12 14 34 15 09 16 10 This has been created using DB wizard... now i have got other table where the values for this ENATI are stored...the table name is nationality_vu i.e SQL>select stle

  • How do i zoom in or out to take a picture?

    How do I zoom in or out before taking a picture?

  • How to open an image in which i can scroll down

    Hello Things may have changed, but I can't figure out how to do this : I got an MSO (1:0% / 2:100%) and i want a button to open the sate 2 which is a big full screen image (1024*2000) okay i can have it opened, and closed etc. but can't find out how

  • Unable to connect TFS 2013 from Visual Studio 2005

    Hi Team, Our customer had recently migrated all TFS Projects in Team Foundation Server from  2010 to 2013  (which has  .NET 2.0,3.5 and 4.0 Projects)  as well. We are facing one critical issue for some developers working in Visual Studio 2005 project