• 0

Compare Two Binary Search Trees


Question

I have been trying to figure out a way to compare two Binary Search Trees without multi-threading or any other such parallel computing means. The goal is to test the equivalence of two Binary Search Trees.

The definition of equivalence here is that the number of nodes must be same, and values contained in the two trees must be equal.

For example, see the attached image for two equivalent trees. Now, how would you test the equivalence of these programmatically?

One method I know of is to traverse the tree using any of the traversal methods - Inorder, Preorder, Postorder, etc. and then compare the results with the other tree's. One may even use a BFS or DFS algorithm.

Any other more efficient ways you can think of doing this?

PS: I am NOT in school. This is NOT a homework assignment. I graduated 3 years ago and I am brushing up on data structures. So please keep an open mind. Thanks!

post-47097-1258666711.png

Link to comment
https://www.neowin.net/forum/topic/847418-compare-two-binary-search-trees/
Share on other sites

9 answers to this question

Recommended Posts

  • 0

it seems that what you really want to know is if they both contain the same nodes since the tree structure can be slightly different and still be balanced.

if you have or can keep a node count in your object that is updated as you add and remove nodes, you could use this as your first check to see if the trees are not equal. if both trees dont have the same number of nodes then you know they're not the same search trees. but having the same node count doesnt mean they are equal, so you can only use node counts to more quickly determine that they're not equal.

the next step if they do have an equal node count would be to traverse one tree and search for that node in the second tree. this should be fairly efficient since you're using search trees. the tree that's traversed would have each node touched once, and the tree being searched is s tree used for searching! at any time in this process if you cant find a node from tree A in tree B you can short circuit the comparison because you know the trees are not equal.

the worst case for this method is when the trees are equal since every node in tree A will have been searched and found in tree B and none of the short circuits would have occurred.

there may be other ways of doing this but this is the first way that popped into my head and it seems pretty good.

  • 0

Interesting! Yes, that sounds like a great solution!

What would be the time complexity of the algorithm you proposed? Is it O(N log N)? N for the tree traversal and log N for the search.

The algorithm in my original post was O(N) + O(N) + O(N) (correct me if I am wrong). However, looking at it from an execution time perspective, it would be slower than O(N log N).

  • 0
  Jebadiah said:
Interesting! Yes, that sounds like a great solution!

What would be the time complexity of the algorithm you proposed? Is it O(N log N)? N for the tree traversal and log N for the search.

The algorithm in my original post was O(N) + O(N) + O(N) (correct me if I am wrong). However, looking at it from an execution time perspective, it would be slower than O(N log N).

Well if I am not mistaken if your algorithm was O(N) then it should be faster no matter what the constants are.

In first case you always have 3*N execution time. So we can roughly say if N > 8 then it's faster than the 2nd algorithm. (I haven't studied any of them).

  • 0

I just got back to this thread. You're right again! In the worst case const * O(N) is better than O(N log N). I just did the calculations with some values of N and came to that conclusion. (Damn! I am so rusty with algorithm analyses now.)

To everyone: any other creative solutions for the original question that you can think of?

  • 0
  Jebadiah said:
That is the solution I talk about in my first post. :)

The preorder and postorder traversals would not produce the numbers in the same order though. And yeah, that seems to be the fastest solution I can currently think of (since it's pretty ****ing fast).

  • 0

function structeq (t1, t2 : tree) : boolean;
begin 
  if t1 = nil										then structeq := t2 = nil
  else if t2 = nil								 then structeq := false
  else if structeq(t1^.left, t2^.left)   then structeq := structeq(t1^.right, t2^.right)
  else												structeq := false
end

That's not my code. But it checks if two tree's have the same structure. To check the values as well you probably need to use "AND" t1.value = t2.value. Probably better to use it with C though, the short-circuited && will come in handy when you want to check the value only if the pointer is not null. (Pascal would require nested if's which is just biah). It's basically what you said, written in Pascal in a neat way.

You can't go any faster than that as far as I know.

  • 0
  gianpan said:
function structeq (t1, t2 : tree) : boolean;
begin 
  if t1 = nil										then structeq := t2 = nil
  else if t2 = nil								 then structeq := false
  else if structeq(t1^.left, t2^.left)   then structeq := structeq(t1^.right, t2^.right)
  else												structeq := false
end

That's not my code. But it checks if two tree's have the same structure. To check the values as well you probably need to use "AND" t1.value = t2.value. Probably better to use it with C though, the short-circuited && will come in handy when you want to check the value only if the pointer is not null. (Pascal would require nested if's which is just biah). It's basically what you said, written in Pascal in a neat way.

You can't go any faster than that as far as I know.

Cool! That way you can check if the two trees are identical in terms of value and structure together in O(N) time. It looks like a Preorder lockstep traversal. Good one!

This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.
  • Posts

    • PlayStation's first wireless fight stick faces long wait, launching in 2026 by Paul Hill Sony has unveiled the FlexStrike wireless fight stick previously known as Project Defiant. Its unveiling marks the PlayStation’s first-ever proprietary fight stick controller. Unfortunately for anyone hoping to get their hands on it soon, Sony won’t be releasing it until 2026, creating a significant wait for eager fighting game fans. Though its release is still some time away, a display unit will be shown off at Evo 2025 (August 1-3). Sony notes that this displayed version of the FlexStrike may not represent the final product. As a bit of background, PlayStation gamers can already get third-party fight sticks, this marks Sony's first official entry into the market. The FlexStrike will be compatible with PS5 and PC via wired connection or wirelessly with PlayStation Link. It features mechanical switch buttons and toolless swappable restrictor gates (square, circle, octagon) with built-in storage. You can also use simultaneous PlayStation Link audio for connecting FlexStrike and a Pulse headset/earbuds on PS5 with a single USB adapter. Sony also mentions that there will be support for two FlexStrike sticks via a single PS Link USB adapter for local multiplayer and includes all DualSense Controller inputs (except directional pad via lever and mute button), plus a touchpad. The controls are adjustable with a built-in level mode switch and a lock button to prevent accidental inputs. So that it’s comfortable to use, Sony has opted for an ergonomic design with angled surfaces and a non-slip base. While we know from Sony that the FlexStrike wireless fight stick is confirmed for a 2026 release, we do not know which day or month to expect it on. Such a late entry into this market means that Sony will have already lost customers who have already invested in fight sticks from other manufacturers. For more information, keep your eyes peeled to Evo 2025 to see what Sony reveals. The company also recommends signing up for news updates on its official FlexStrike website.
    • But LTSC wouldn't be supported either! (although wouldn't give you Recall, I guess) LTSC has the same TPM requirement as Home/Pro and you can whistle for any help from Microsoft because you're clearly pirating it. Recall can be removed for good quite easily if you really don't trust Microsoft. Not that it affects you anyway. Many reasons to switch to Linux but you've just called out two that actually aren't #rollseyes
    • ISTM the bigger the number gap in an update the greater number of users that are impacted or benefit from the update. I have never found a two decimal place software update to be beneficial to the majority of the software users.
    • He says something one day and the next day he changes it or claims he never said it.
    • "It was found that participants could detect when human portraits were fake with the most ease but struggled significantly when it came to natural and urban landscapes with success rates dropping to 59-61%" That is interesting because people have been viewing fake natural and urban landscapes on TV and in movies for decades.
  • Recent Achievements

    • One Month Later
      BA the Curmudgeon earned a badge
      One Month Later
    • First Post
      Doreen768 earned a badge
      First Post
    • One Month Later
      James_kobe earned a badge
      One Month Later
    • Week One Done
      James_kobe earned a badge
      Week One Done
    • Week One Done
      macomen earned a badge
      Week One Done
  • Popular Contributors

    1. 1
      +primortal
      651
    2. 2
      ATLien_0
      253
    3. 3
      Xenon
      168
    4. 4
      neufuse
      147
    5. 5
      +FloatingFatMan
      124
  • Tell a friend

    Love Neowin? Tell a friend!