Level=> level order traversal => Breath First Search
Method1: list = new LinkedList();
Method2: TreeLinkNode head = root; // use TreeLinkNode next feature as a queue
if ( curHead == null ){
curHead= lastCur.left;
pre = curHead; }
else
{
pre.next = lastCur.left or ritght
}
// NOTE : the reason need two layer of while is because we no idea
when to update lastHead even we have curHead complete
while (lastHead != null) {
TreeLinkNode lastCur = lastHead; // Like while (!queue.isEmpty())
while ( lastCur != null ) // like for loop in the above {
lastCur = lastCur.next;
}
lastHead = curHead;
curHead = null;
}
OR
//while(lastHead!=null)
//{
// TreeLinkNode lastCur = lastHead;
while(lastCur != null)
{
.....
if (lastCur == null)
{
lastCur = curHead;
curHead = null;
}
1 / \ 2 3 / \ / \ 4 5 6 7
After calling your function, the tree should look like:
1 -> NULL / \ 2 -> 3 -> NULL / \ / \ 4->5->6->7 -> NULL
NOTE: At leaves, for loop all leaves but doesn't add any nodes
list = new LinkedList();
for ( int i = 0 ; i < result.get(level).size();i++ )
{ // Like a queue in-insertion order
TreeNode n = (TreeNode) result.get(level).get(i);
if ( n ! = null )
{
if (n.left != null)
if (n.left != null)
list.add(n.left);
if (n.right != null)
list.add(n.right);
}
if (list.size() > 0 ) {
if (list.size() > 0 ) {
result.add(level+1, list);
}
else
{
break;
}
level++;
2. Implementation
In a usual BST, we simply traverse the nodes without caring which level we are on. In this case, it is critical to know the level.
We thus use a dummy node to indicate when we have finished one level and are starting on the next.
2. Implementation
In a usual BST, we simply traverse the nodes without caring which level we are on. In this case, it is critical to know the level.
We thus use a dummy node to indicate when we have finished one level and are starting on the next.
public List> findLevelLinkedList( TreeNode root ) { int level = 0; List > res = new ArrayList >(); LinkedList list = new LinkedList (); queue.add(root); res.add(level, list); while(true) { // NOTE: a new linked list start with a new level list = new LinkedList (); for ( int i = 0 ; i < result.get(level).size();i++ ) { TreeNode cur = (TreeNode) result.get(level).get(i); if ( cur ! = null ) { if (cur.left != null) list.add(cur.left); if (cur.right != null) list.add(cur.right); } } if (list.size() > 0 ) { result.add(level+1, list); } else { break; } level++; } return result; }
struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *next; } public void findLevelLinkedList (TreeNode root) { // vlaidate hte input if (root == null) return; TreeLinkNode lastHead = root; // As a queue TreeLinkNode pre = null; TreeLinkNode curHead = null; //int lastNum = 1; //int curNum = 0; while (lastHead != null) { TreeLinkNode lastCur = lastHead; // Like while (!queue.isEmpty()) while ( lastCur != null ) // like for loop in the baove { if (lastCur.left != null) { if ( curHead == null ) { curHead= lastCur.left; pre = curHead; } else { pre.next = lastCur.left; pre = pre.next; } } if (lastCur.right != null ) { if ( curHead == null ) { curHead = lastCur.right; pre = curHEad; } else { pre.next = lastCur.next; pre = pre.next; } } lastCur = lastCur.next;// next element in Queue } lastHEad = curHead; // new linkedl list in current level curHead = null; } }3. similar Ones
No comments:
Post a Comment