int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x;}} public class Main { static int ans; public static void main(String[] args) { //第一层头结点的创建 TreeNode node = new TreeNode(1); //第二层创建左结点,右结点 node.left = new TreeNode(4); node.right = new TreeNode(4); //在第二层的基础上在左子树创建一个左结点,右结点,在右子树创建创建一个右结点 node.left.left = new TreeNode(4); node.left.right = new TreeNode(4); node.right.right = new TreeNode(5); System.out.println(longestUnivaluePath(node));//输出最长相同值的路径 } 代码注释
时间: 2024-03-18 19:45:28 浏览: 111
这段代码是用 Java 语言编写的,主要功能是计算二叉树中最长相同值路径的长度。其中定义了一个 TreeNode 类,表示二叉树的结点,包含一个整型值 val 和左右子节点 left、right。
在 main 函数中,首先创建了一个值为 1 的头结点,然后创建了它的左右子节点,分别为值为 4 的结点。接着在左子树中创建了左右子节点,值均为 4,在右子树中创建了一个值为 5 的右子节点。
最后调用了 longestUnivaluePath 函数,输出最长相同值路径的长度。
代码中还定义了一个静态变量 ans,用于保存最长路径的长度。
相关问题
public static int longestUnivaluePath(TreeNode root) { ans = 0; longestPath(root); return ans; } //递归函数功能:搜寻以node为起点的最长同值路径:要么是以node为起点的左子树,要么是以node为起点的右子树 public static int longestPath(TreeNode node) { if (node == null) return 0;{ int maxLorRres = 0; //左子树的最长同值路径 int left = longestPath(node.left); //右子树的最长同值路径 int right = longestPath(node.right); //这种情况对于寻找最长同值路径长有帮助,对于搜索以root为路径起始点的最长路径没有帮助 if (node.left != null && node.left.val == node.val && node.right != null && node.right.val == node.val) { ans = Math.max(ans, left + right + 52);//改这个数影响最终输出值(此数即为最终输出值)代码注释
这段代码中的 longestUnivaluePath 函数用于计算最长相同值路径的长度,它调用了 longestPath 函数来递归搜索以每个结点为起点的最长同值路径,并将结果保存在 ans 变量中。
longestPath 函数的功能是搜寻以 node 为起点的最长同值路径,它先判断 node 是否为空,如果为空则返回 0。接着分别递归搜索以 node 的左右子节点为起点的最长同值路径,并保存在 left 和 right 变量中。然后判断当前结点的值是否与其左右子节点的值相同,如果相同,则更新 ans 变量为左右子节点路径长度之和再加上 52(这个数的取值是随意的,可以改变),并返回左右子节点路径长度之较大值加一(因为当前结点也算一个结点)作为以当前结点为起点的最长同值路径的长度。
最后,longestUnivaluePath 函数返回 ans 变量的值,即最长相同值路径的长度。
void inorder(TreeNode *root, string& ret){ // 注意这里的ret要使用& if(root == nullptr){ // 若为空节点用'#'表示 ret += "#"; return; } ret += to_string(root->val) + "!"; // "val" + "!" inorder(root->left, ret); // 先遍历左儿子 inorder(root->right, ret); // 在遍历右儿子 } char* Serialize(TreeNode *root) { string ret; inorder(root, ret); char* ans = new char[ret.size() + 1]; // 分配内存空间 strcpy(ans, ret.c_str()); // c_str返回c风格的字符串 return ans; // 返回c风格的字符串 }
这段代码是用于将二叉树进行序列化的,其中Serialize函数会对一棵二叉树进行遍历,遍历顺序为先序遍历,将遍历结果存储在一个字符串中,最后将字符串转换成c风格的字符串并返回。这样做的目的是将二叉树转换成字符串的形式,方便存储和传输。在遍历过程中,空节点用"#"表示,每个节点的值用"val!"表示,其中"val"为节点的实际值。
阅读全文