How to build a tree with it BFS and bypass DFS

I have a trace BFSand a DFStree. How can I restore a tree from these rounds?

For example:

BFS Traversal : 4 3 5 1 2 8 7 6

DFS Traversal : 4 3 1 7 2 6 5 8

then the tree will look like the following:

       4
      / \
     3   5    
    / \   \    
   2   1   8
   |   |         
   6   7      
+4
source share
2 answers

This is only possible if BFS and DFS use exactly the same order to move children:

Rule 1:

BFS Traversal : 4 3 5 1 2 8 7 6
                | | |
                | | |-------|
                | |         |
DFS Traversal : 4|3 1 7 2 6|5 8

As this example shows, we can easily understand what (3 , 1 , 7 , 2 , 6)belongs to a subtree that has 3 as root. Since 1 is also part of this subtree, we can get that 3 and 5 are the only children of 4.

2:

BFS Traversal : 4 3 5 1 2 8 7 6
                | |   |
                | | |-|
                | | |        
DFS Traversal : 4 3 1 7 2 6 5 8

, , 3 5 4.

, BFS DFS, , ( , 1):

1:

BFS Traversal: 1 2 7 6
               | |
               | |-|
               |   |
DFS Traversal: 1|7|2 6

, 7 1.

2:

BFS Traversal: 1 2 7 6
               |   |
               | |-|
               | |  
DFS Traversal: 1 7 2 6

, 1 2 ( 3).

, :

addchild(int parent, int child) := add the child to the specified parent node

void process(int[] bfs , int[] dfs)
    int root = bfs[0]

    //find all peers (nodes with the same level and parent in the tree) using Rule 2
    int at = bfs.find(dfs[2])
    int peers[at - 1]
    for int i in [1 , at[
        peers[i - 1] = bfs[i]
        addchild(root , bfs[i])

    //for each of the childtree of the tree find it children using Rule 1
    for int i in [0 , length(peers)[
        //all nodes that are either peers[i] or a child of peers[i]
        int[] children_dfs = dfs.subset(dfs.find(peers[i]) , (i < length(peers) - 1 ? dfs.find(peers[i + 1]) : length(dfs)) - 1)
        //a subset of bfs containing peers[i] and it children in the order they have in bfs
        int[] children_bfs = bfs.allMatchingInOrder(children_dfs)

        //generate the subtree
        process(children_bfs , children_dfs)
+6

. ( DFS )

.

-1

Source: https://habr.com/ru/post/1608855/


All Articles