• 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
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
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
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

    • Nearly half of American adults now use AI, but concerns are also growing by Hamid Ganji Since the launch of ChatGPT in 2022, the way people research, get their news, and perform routine tasks has changed dramatically. Now, almost everything around us has a touch of AI, and companies are trying to embed it into nearly every product and service they offer. With that in mind, new research shows how Americans are actually adopting this change and using AI in their everyday lives. According to new research conducted by the Pew Research Center, 49% of American adults now use AI chatbots like ChatGPT or Gemini. This marks a significant increase over last year, when only 33% of American adults reported using AI. Additionally, four in ten U.S. adults (42%) said they use AI tools to research information, while 38% said they use these tools to handle tasks at work. Entertainment, image and video editing, and getting medical advice are among the other ways Americans are using AI. Moreover, ChatGPT dominates the U.S. AI market, with 44% of respondents saying they use OpenAI's chatbot. Gemini follows at 24%, while Copilot and Meta AI account for 17% and 14%, respectively. Respondents also said that AI chatbots generally have a positive impact on their productivity and how informed they are. But when it comes to AI’s impact on society, Americans remain largely skeptical. About 40% of American adults believe AI will be more harmful than beneficial to society over the next 20 years. Additionally, 31% expect AI to have a negative effect on them personally. Another 31% of respondents say AI could be equally positive and negative. As for data security, pessimism remains high: 71% of respondents say AI will make their personal information less secure, while only 3% believe it will make their data more secure. American adults also largely lack confidence in both the government and AI companies when it comes to regulating and developing AI. About 67% of Americans have little to no confidence in the U.S. government’s ability to regulate AI effectively. Six in ten adults are also not confident that U.S. companies will develop and use these tools responsibly.
    • MultiOS-USB 0.11.1 by Razvan Serea MultiOS-USB is a versatile, open-source utility designed to create multiboot USB drives capable of hosting multiple operating systems on a single portable device. The project simplifies the process of building a bootable USB by automating the configuration of various boot loaders and file systems, enabling users to install and run diverse operating systems, including Windows, Linux distributions, and diagnostic tools, directly from one drive. It supports ISO booting and persistence, which allows changes made during live sessions to be retained, making it ideal for testing, troubleshooting, or system recovery. Features: BIOS and UEFI support Secure Boot support (boot, manage uefi keys) Load UEFI drivers Launch .efi executables and other boot loaders Boot Linux from .iso images Boot WinPE from bootable .wim images Boot Windows 10/11 installer from ISO (currently, SB must be disabled during installation) Boot Linux installer from network (experimental) Boot locally installed systems: Linux, Windows Automatically update configuration files Without background services exFAT file system support Automatic detection of compatible ISO images (GRUB loopback) Support for systems without loopback support Allows customisation of ISO boot menu (for example: custom kernel options) Support for USB, SSD, nvme, mmcblk, loop, nbd and virtual disks Support for x86, x86_64 A list of tested ISO images can be found here MultiOS-USB 0.11.1 changelog: 68122b7: Fixed-release AUR package #63 fba0283: Update shim to 16.1 8c2ae95: Update grub to v2.14-1 ea15c1d: Update Memtest86+ to v8.10 162f4e6: Add secureblue (#71) b2da8ae: Add AerynOS (#74) ac6640e: Bump config.version 34e9ca6: Add Bluefin (#72) 7a10edd: Add Aurora (#66) cab701b: Update wimboot to v2.9.0-1 90da7f7: Fix Windows error: 0x80070001 - 0x4002F (#52) 2dea73d: Add Microsoft certificates 01f479e: Remove old efi_uga module Download: MultiOS-USB 0.11.1 | 5.3 MB (Open Source) View: MultiOS-USB Website | Screenshot Get alerted to all of our Software updates on Twitter at @NeowinSoftware
    • Latest Rufus update improves new Windows 11 install method by Taras Buria Pete Batard, the maker of Rufus, a very popular app for creating bootable Windows (and other OS) media, has released a new beta version of its app. Rufus 4.15 beta is now out, and while it offers no new features, there are all sorts of improvements and fixes, including for the new Windows 11 installation method that was introduced in version 4.14 in early May. The "Silent Windows 11 installation" is a new feature whose goal is to automate operating system installation. All you have to do is boot from the drive, and then Rufus takes over, doing all things for you, such as setting up a new account, skipping ads and prompts, and more. It is a very handy tool, but initially, it had some bugs and issues that required addressing. With version 4.15 beta, Rufus is fixing that, particularly a bug with installation failing at 75%, crashes on Snapdragon X-based PCs, and more. Here is the changelog: Rufus 4.15 beta is now available for download from its GitHub repository. If you have never used Rufus before, you can check out our guide here. It is a very useful utility to have, as it allows you to deal with plenty of Windows 11's annoyances, which are still there, despite Microsoft's ongoing efforts to fix them.
    • Microsoft fixes one of Excel Copilot's most frustrating limitations by Usama Jawad Microsoft began integrating Copilot into Excel a couple of years ago and has been upgrading it with new functionalities since then. While some changes have been controversial, Microsoft is hoping to win over users by allowing them to be more productive via Copilot. To that end, it has now announced a Copilot improvement that may actually be appreciated by people who use it regularly. Excel customers often use the Copilot prompt box to issue instructions to format and customize their data, but it can become quite tiring to keep repeating the same instructions again and again. Microsoft now allows you to define Copilot personalization rules for formatting, naming conventions, formulas, and report styles. These can be accessed via Settings > Personalization, where you can explain your rules in natural language like "Always format currency in USD with no decimals", and just let Copilot take care of the rest. Microsoft is going a step further in this direction by allowing you to set workbook rules too. These rules are stored as a .Rules sheet, and are preserved while the workbook is shared. This fosters collaboration while making sure that standard rules govern the Copilot editing experience across the organization. Other advantages of this capability include pointing it to specific examples, defining dynamic formulas, and referencing an entire sheet and asking Copilot to infer rules based on that. You can leverage this feature by opening Copilot in Excel, clicking on "+", and selecting Create workbook rules. If you have an existing .Rules sheet, you can simply start listing the rules in column A as well. Personalization features are available to all Copilot in Excel users across the web, Mac, and Windows. Meanwhile, workbook rules are currently being previewed for Windows and Mac customers on the Insiders channel. General availability is scheduled after a few weeks, but a concrete date is currently unknown. Overall, the Excel capability is quite similar to ChatGPT's memory features, which allow you to permanently store items in the AI model's context window.
  • Recent Achievements

    • One Month Later
      Vincian earned a badge
      One Month Later
    • First Post
      Jocimo earned a badge
      First Post
    • Week One Done
      suprememobiles48 earned a badge
      Week One Done
    • One Month Later
      Windows Guy earned a badge
      One Month Later
    • One Month Later
      Prasann earned a badge
      One Month Later
  • Popular Contributors

    1. 1
      +primortal
      510
    2. 2
      +Edouard
      172
    3. 3
      PsYcHoKiLLa
      90
    4. 4
      Steven P.
      76
    5. 5
      neufuse
      68
  • Tell a friend

    Love Neowin? Tell a friend!