2026/4/8 18:45:21
网站建设
项目流程
浙江天奥建设集团网站,汕头潮南网站建设,广东东莞天气预报15天,unity 做网站1.题目2.思路
#xff08;1#xff09;思路#xff1a;
可以用dfs#xff0c;深度优先遍历#xff0c;但是要符合先遍历左孩子再遍历左孩子的右孩子的规则#xff1b;或者先遍历右孩子再遍历右孩子的左孩子。最后把路径上的节点个数-1#xff0c;就是所得的节点个数。
但…1.题目2.思路1思路可以用dfs深度优先遍历但是要符合先遍历左孩子再遍历左孩子的右孩子的规则或者先遍历右孩子再遍历右孩子的左孩子。最后把路径上的节点个数-1就是所得的节点个数。但是最长 ZigZag 不一定从根开始所以不能只沿着根的一条“左-右-左…”或“右-左-右…”走到底需要在每个节点都考虑作为起点的可能性。最常用做法是DFS 时同时维护“当前上一步方向 当前长度”并在每个节点尝试“继续交替”与“重新开始”。2定义 dfs(node, dir, len)dir0 表示“上一步走的是左边”所以下一步要走右才算继续dir1 表示“上一步走的是右边”所以下一步要走左才算继续len 表示当前 ZigZag 的边数长度。第一个参数 node表示“当前递归走到的节点是谁”一个 TreeNode 对象第二个参数 dir表示“到达这个 node 的上一条边方向是什么”一个方向标记不是节点第三个参数 len表示“当前 ZigZag 的长度边数”3ans 为什么作为全局变量方便在 DFS 的所有分支里共享并更新最大值。3.代码实现/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val val; } * TreeNode(int val, TreeNode left, TreeNode right) { * this.val val; * this.left left; * this.right right; * } * } */classSolution{intans0;publicintlongestZigZag(TreeNoderoot){if(rootnull)return0;// 从根的左边开始长度为1条边dfs(root.left,0,1);//代表上一步的方向是向左//从根的右边开始长度为1条边dfs(root.right,1,1);//代表上一步的方向是向右returnans;}//TreeNode node符合zigzag路线的起始节点不一定是根节点publicvoiddfs(TreeNodenode,intdir,intlen){if(nodenull)return;ansMath.max(ans,len);if(dir0)//上一步方向是向左,下一步要走右才算继续{dfs(node.right,1,len1);//向右相反方向长度1dfs(node.left,0,1);//向左相同方向重置长度就是1}else{//上一步方向是向右,下一步要走左才算继续dfs(node.right,1,1);//向右相同方向重置长度就是1dfs(node.left,0,len1);//向左相反方向长度1}}}