用java比较两个二叉搜索树是否等价

2023-12-13 10:44:04

一. 定义树的的节点

? 不同二叉树的叶节点上可以保存相同的值序列。例如,以下两个二叉树都保存了序列 1,1,2,3,5,8,13
在这里插入图片描述

package com.wedoo.coderyeah.module.iot.algorithm;

import lombok.Data;

/**
 * @author lqs
 * @date 2023/12/6 15:23
 */
@Data
public class TreeNode { // 比较两个二叉搜索树是否等价
    private TreeNode Left; // 左边的树结构
    private Integer Value; // 树节点的数值
    private TreeNode Right; // 右边的树结构

    // 构造方法
    TreeNode(int x) {
        Value = x;
    }
}

二. 具体实现

package com.wedoo.coderyeah.module.iot.algorithm;

import java.util.ArrayList;
import java.util.List;

/**
 * @author lqs
 * @date 2023/12/6 15:27
 */
public class BinaryTree {

    // 用于保存每个节点值 
    public static void saveNodeValues(TreeNode node, List<Integer> list) {
        if (node == null) {
            return;
        }
        // 递归调用自己 左树
        saveNodeValues(node.getLeft(), list);
        // 将值保存在集合中 最后所得是整棵树的各节点值
        list.add(node.getValue());
         // 递归调用自己 右树
        saveNodeValues(node.getRight(), list);
    }

    // 用于比较两棵树是否等价
    public static Boolean compare(TreeNode tree1, TreeNode tree2) {
        // 准备集合保存节点值
        List<Integer> list1 = new ArrayList<>();
        List<Integer> list2 = new ArrayList<>();
        saveNodeValues(tree1, list1);
        saveNodeValues(tree2, list2);
        System.out.println("list1:" + list1);//list1:[2, 1, 9]
        System.out.println("list2:" + list2);//list2:[2, 1, 3]
		// 比较集合是否相等
        return list1.equals(list2);
    }

    public static void main(String[] args) {
        // 构造第一颗二叉树
        TreeNode treeNode = new TreeNode(1);
        treeNode.setLeft(new TreeNode(2));
        treeNode.setRight(new TreeNode(3));
		// 构造第二颗二叉树
        TreeNode treeNode2 = new TreeNode(1);
        treeNode2.setLeft(new TreeNode(2));
        treeNode2.setRight(new TreeNode(9));

        Boolean aBoolean = compare(treeNode2, treeNode);
        System.out.println("aBoolean: " + aBoolean);
    }
}

三. GO实现

package main

import (
    "fmt"
    "golang.org/x/tour/tree"
)

// 二叉树查找比较 等价二叉查找树
func main() {
    t1 := tree.New(1)
    t2 := tree.New(1)
    b := compare(t1, t2)
    fmt.Println("t1==t2:", b)
}

func Walk(t *tree.Tree, ch chan int) {
    if t == nil { // 空树 没有叶子节点
       return // 递归函数结束条件
    }
    Walk(t.Left, ch)
    ch <- t.Value
    Walk(t.Right, ch)
}

func compare(t1, t2 *tree.Tree) bool {
    c1 := make(chan int) // 管道 传递数据 无缓冲默认1,按顺序传递数据
    c2 := make(chan int)
    go Walk(t1, c1)
    go Walk(t2, c2)
    for i := 0; i < 10; i++ {
       x, y := <-c1, <-c2
       fmt.Println(x, y)
       if x != y {
          return false
       }
    }
    return true
}
0; i++ {
       x, y := <-c1, <-c2
       fmt.Println(x, y)
       if x != y {
          return false
       }
    }
    return true
}

文章来源:https://blog.csdn.net/qq_49195366/article/details/134834174
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。