• 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

    • OpenAI asks employees to reject Meta's "ridiculous" poaching offers in stern memo by Usama Jawad OpenAI is the place to be right now, especially for prolific engineers who are willing to join CEO Sam Altman in the quest for Artificial General Intelligence (AGI). It seems that its rivals have recognized that OpenAI's biggest strength is its employees too, and there have been multiple reports that Meta is poaching its staffers. In fact, Altman himself mentioned recently that Meta is hiring his company's members by offering them up to $100 million in signing bonuses. The company obviously isn't pleased with this situation and has asked its staffers in an internal memo to reject any advances from Meta in the weeks to come. Wired (paywall) reports that OpenAI's Chief Research Officer Mark Chen has published a memorandum in the company's Slack, likening the poaching situation to someone breaking into OpenAI's home and stealing from them. Chen further stated that he will be working with senior leadership including Altman to figure out ways to reward employees with Meta offers in hand with financial compensation and even adjust their overall compensation figures. That said, the executive emphasized that his primary aim is to retain top talent. Chen also quoted messages from seven other senior members of OpenAI's research team with guidance about how to tackle the situation if Meta tries to hire them. One of the advice included asking Meta recruiters to back off if they try to pressurize them with "ridiculous" offers. It is important to note that OpenAI employees have reportedly been struggling with intensive 80-hour work-weeks recently and the company will largely experience a shutdown period next week so that its staffers can recharge. OpenAI believes that this period is also vulnerable for its members as Meta will likely ramp up its hiring efforts during this break. Chen reminded OpenAI employees that they should focus on their main quest, which is achieving AGI, and that confrontations with Meta during this difficult period are just side quests. It is unclear how responsive OpenAI staffers will be to the memo's instructions in the coming days, especially when stacking it up against the reported multi-million compensation offers from Meta. Zuckerberg is even reaching out to some OpenAI employees personally, with the most recent report indicating that Meta had hired four senior OpenAI researchers for its superintelligence lab.
    • Exactly. Use it is fine, but copyright is another story...
    • Not really, I am pretty hot at the moment and tomorrow I will be even hotter as the U.K are some hot days. Not looking forward to work. I just don't want to connect my computer to MS servers, I have no need to, the same with my Mac not being connected to Apple Servers. I have no need for MS or Apple accounts.
    • Really? Do you want it spelled out? Ok: It was a funsies way to say that we can confidently asume that their update servers were shut down years ago already, and no updates have been developed or delivered to any LG phone in years, since, to begin, LG wasn't too well known for their software support.
  • Recent Achievements

    • Community Regular
      Primey_ went up a rank
      Community Regular
    • Reacting Well
      Gromvar earned a badge
      Reacting Well
    • Dedicated
      BreakingBenjamin earned a badge
      Dedicated
    • Week One Done
      Hartej earned a badge
      Week One Done
    • One Year In
      TsunadeMama earned a badge
      One Year In
  • Popular Contributors

    1. 1
      +primortal
      515
    2. 2
      +FloatingFatMan
      184
    3. 3
      ATLien_0
      169
    4. 4
      Skyfrog
      96
    5. 5
      Som
      95
  • Tell a friend

    Love Neowin? Tell a friend!