一. 定义树的的节点
不同二叉树的叶节点上可以保存相同的值序列。例如,以下两个二叉树都保存了序列 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 mainimport ("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.ValueWalk(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, <-c2fmt.Println(x, y)if x != y {return false}}return true
}
0; i++ {x, y := <-c1, <-c2fmt.Println(x, y)if x != y {return false}}return true
}