一. 定义树的的节点
不同二叉树的叶节点上可以保存相同的值序列。例如,以下两个二叉树都保存了序列 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
}