力扣589、590、102、107、429、199、637、515、116、117、104、111、226、101-Java刷题笔记

一、589. N 叉树的前序遍历 - 力扣(LeetCode)

1.1题目

给定一个 n 叉树的根节点  root ,返回 其节点值的 前序遍历 。

n 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null 分隔(请参见示例)。


示例 1:

输入:root = [1,null,3,2,4,null,5,6]
输出:[1,3,5,6,2,4]

示例 2:

输入:root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]
输出:[1,2,3,6,7,11,14,4,8,12,5,9,13,10]

1.2思路分析

方法一递归

方法二迭代

1.3代码实现

方法一递归

/*
// Definition for a Node.
class Node {public int val;public List<Node> children;public Node() {}public Node(int _val) {val = _val;}public Node(int _val, List<Node> _children) {val = _val;children = _children;}
};
*/
// 递归遍历
class Solution {public List<Integer> preorder(Node root) {List<Integer> res = new ArrayList<>();pre(root,res);return res;}public void pre (Node root ,List<Integer> res){if(root == null) return;// 将根节点的值放入到数组中res.add(root.val);// 循环遍历孩子for(Node ch : root.children){pre(ch,res);} }}

方法二迭代

/*
// Definition for a Node.
class Node {public int val;public List<Node> children;public Node() {}public Node(int _val) {val = _val;}public Node(int _val, List<Node> _children) {val = _val;children = _children;}
};
*/class Solution {public List<Integer> preorder(Node root) {if(root == null) return Collections.emptyList();// 先将根节点放置到栈中;然后依次遍历根节点的所有孩子Stack<Node> stack = new Stack<>();List<Integer> res = new ArrayList<>();stack.push(root);while(!stack.isEmpty()){// 弹出根节点// 并将根节点的值添加到结果数组中Node temp = stack.pop();res.add(temp.val);// 获得该根节点的所有孩子节点并放入到数组中List<Node> children = temp.children;// 将孩子节点依次遍历到栈中 因为入栈顺序是由右向左所以i从children.size()-1开始遍历for(int i = children.size()-1 ; i>=0 ;i--){// 依次遍历孩子节点stack.push(children.get(i));}}return res;}
}

二、590. N 叉树的后序遍历 - 力扣(LeetCode)

2.1题目

给定一个 n 叉树的根节点 root ,返回 其节点值的 后序遍历 。

n 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null 分隔(请参见示例)。

示例 1:

输入:root = [1,null,3,2,4,null,5,6]
输出:[5,6,3,2,4,1]

示例 2:

输入:root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]
输出:[2,6,14,11,7,3,12,8,4,13,9,10,5,1]

提示:

  • 节点总数在范围 [0, 104] 内
  • 0 <= Node.val <= 104
  • n 叉树的高度小于或等于 1000

2.2思路分析

方法一递归

方法二迭代

2.3代码实现

方法一递归

/*
// Definition for a Node.
class Node {public int val;public List<Node> children;public Node() {}public Node(int _val) {val = _val;}public Node(int _val, List<Node> _children) {val = _val;children = _children;}
};
*/class Solution {public List<Integer> postorder(Node root) {List<Integer> res = new ArrayList<>();pre(root,res);return res;}public void pre(Node node,List<Integer> res){if(node == null) return;for(Node ch : node.children){pre(ch,res);}// 先便孩子,最终使得每个孩子成为根节点,然后再将根节点添加到结果数组中res.add(node.val);}
}

方法二迭代 

/*
// Definition for a Node.
class Node {public int val;public List<Node> children;public Node() {}public Node(int _val) {val = _val;}public Node(int _val, List<Node> _children) {val = _val;children = _children;}
};
*/class Solution {public List<Integer> postorder(Node root) {if(root == null) return Collections.emptyList();// 定义栈存放遍历的节点Stack<Node> stack = new Stack<>();List<Integer> res = new ArrayList<>();stack.push(root);while(!stack.isEmpty()){Node temp = stack.pop();res.add(temp.val);List<Node> children = temp.children;// 从左向右遍历for(int i = 0 ;i<children.size(); i++){stack.push(children.get(i));}}Collections.reverse(res);return res;}
}

三、102. 二叉树的层序遍历 - 力扣(LeetCode)

3.1题目

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]

示例 2:

输入:root = [1]
输出:[[1]]

示例 3:

输入:root = []
输出:[]

3.2思路分析

利用队列先入先出的特性存放每层的节点并依次遍历,先根,然后存放根的左孩子与右孩子,依次类推。 


3.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;*     }* }*/
class Solution {// 定义一个结果数组List<List<Integer>> resultList = new ArrayList<List<Integer>>();public List<List<Integer>> levelOrder(TreeNode root) {if(root == null) return resultList;fun(root,0);return resultList;}public void  fun(TreeNode root ,int deep){// 定义一个队列存放节点Queue <TreeNode> queue = new LinkedList<>();// 定义个临时节点存放结果TreeNode temp;// 将根节点放入到队列中queue.offer(root);while(!queue.isEmpty()){// 定义放在循环里面保证每次生成一个新的结果数组List <Integer> result = new ArrayList<>();// 每层循环遍历完更新deepdeep = queue.size();// 将每层的节点依次放入到结果队列中while(deep >0 ){temp = queue.poll();result.add(temp.val);// 将左孩子与右孩子依次放入到队列中if(temp.left != null) queue.offer(temp.left);if(temp.right != null) queue.offer(temp.right);deep--;}resultList.add(result);}}
}

四、107. 二叉树的层序遍历 II - 力扣(LeetCode)

4.1题目

给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:[[15,7],[9,20],[3]]

示例 2:

输入:root = [1]
输出:[[1]]

示例 3:

输入:root = []
输出:[]

4.2思路分析

先层序遍历再反转

4.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;*     }* }*/// 先层序遍历再反转
class Solution {// 定义一个结果数组放置结果List<List<Integer>> resultList = new ArrayList<List<Integer>>();public List<List<Integer>> levelOrderBottom(TreeNode root) {if(root == null) return resultList;fun(root,0);// Collections.reverse()没有返回值Collections.reverse(resultList);return resultList;}public void fun(TreeNode node, int deep){//定义队列放置结果Queue <TreeNode> queue = new LinkedList<>();TreeNode temp;queue.offer(node);while(!queue.isEmpty()){deep = queue.size();List<Integer> result = new ArrayList<>();while(deep>0){temp = queue.poll();result.add(temp.val);if(temp.left != null ) queue.offer(temp.left);if(temp.right!=null) queue.offer(temp.right);deep--;}resultList.add(result);}}
}

五、429. N 叉树的层序遍历 - 力扣(LeetCode)

5.1题目

给定一个 N 叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。

树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(参见示例)。

示例 1:

输入:root = [1,null,3,2,4,null,5,6]
输出:[[1],[3,2,4],[5,6]]

示例 2:

输入:root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]
输出:[[1],[2,3,4,5],[6,7,8,9,10],[11,12,13],[14]]

5.2思路分析

定义队列对n叉树进行依次遍历,根据队列的大小控制队列每层需要出的根节点数量,弹出后,再将根节点的所有孩子加入到队列中,并跟新队列的大小。

5.3代码实现

/*
// Definition for a Node.
class Node {public int val;public List<Node> children;public Node() {}public Node(int _val) {val = _val;}public Node(int _val, List<Node> _children) {val = _val;children = _children;}
};
*/class Solution {List<List<Integer>> result = new ArrayList<List<Integer>>();public List<List<Integer>> levelOrder(Node root) {if(root == null) return result;fun(root,0);return result;}public void fun(Node root, int deep){Queue <Node> queue = new LinkedList<>();queue.offer(root);while(!queue.isEmpty()){List<Integer> res = new ArrayList<>();deep = queue.size();while(deep>0){Node temp = queue.poll();res.add(temp.val);List<Node> children =temp.children;for(Node ch:children){queue.offer(ch);}deep--;}result.add(res);}}}

六、199. 二叉树的右视图 - 力扣(LeetCode)

6.1题目

给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。

示例 1:

输入: [1,2,3,null,5,null,4]
输出: [1,3,4]

示例 2:

输入: [1,null,3]
输出: [1,3]

示例 3:

输入: []
输出: []

6.2思路分析

二叉树的右视图其实就是当前层的最后一个节点的值

6.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;*     }* }*/
class Solution {List<Integer> result = new ArrayList<>();public List<Integer> rightSideView(TreeNode root) {if (root == null) return result;fun(root,0);return result;}public void fun(TreeNode root,int deep){Queue <TreeNode> queue = new LinkedList<>();queue.offer(root);while(!queue.isEmpty()){deep = queue.size();for(int i = 0; i<deep;i++){TreeNode temp = queue.poll();if(temp.left!=null) queue.offer(temp.left);if(temp.right!= null) queue.offer(temp.right);// 右视图的结果其实就是当前层的最后一个节点if(i == deep - 1) result.add(temp.val);}  }}
}

七、637. 二叉树的层平均值 - 力扣(LeetCode)

7.1题目

给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10-5 以内的答案可以被接受。

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:[3.00000,14.50000,11.00000]
解释:第 0 层的平均值为 3,第 1 层的平均值为 14.5,第 2 层的平均值为 11 。
因此返回 [3, 14.5, 11] 。

示例 2:

输入:root = [3,9,20,15,7]
输出:[3.00000,14.50000,11.00000]

7.2思路分析

对每层的节点求和取平均。

7.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;*     }* }*/
class Solution {List<Double> res = new ArrayList<>();public List<Double> averageOfLevels(TreeNode root) {fun(root,0);return res;}public void fun(TreeNode root,int deep){if(root == null) return ;Queue<TreeNode> queue  = new LinkedList<>();TreeNode temp;queue.offer(root);while(!queue.isEmpty()){Double sum = 0D ;deep = queue.size();int cur = deep;while(deep>0){temp = queue.poll();sum += temp.val;if(temp.left!=null) queue.offer(temp.left);if(temp.right!=null) queue.offer(temp.right);deep--;}res.add(sum/cur);}}
}

八、515. 在每个树行中找最大值 - 力扣(LeetCode)

8.1题目

给定一棵二叉树的根节点 root ,请找出该二叉树中每一层的最大值。

示例1:

输入: root = [1,3,2,5,3,null,9]
输出: [1,3,9]

示例2:

输入: root = [1,2,3]
输出: [1,3]

8.2思路分析

初始化最大值时需要考虑负数情况,因此需要将其初始化为最小的整数

8.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;*     }* }*/
class Solution {List<Integer> result = new ArrayList<>();public List<Integer> largestValues(TreeNode root) {fun(root,0);return result;}public void fun(TreeNode node ,int deep){if(node == null) return;Queue <TreeNode> queue = new LinkedList<>();queue.offer(node);while(!queue.isEmpty()){deep = queue.size();int maxTemp = Integer.MIN_VALUE;while(deep>0){TreeNode temp = queue.poll();maxTemp = temp.val > maxTemp ? temp.val:maxTemp;if(temp.left != null) queue.offer(temp.left);if(temp.right != null) queue.offer(temp.right);deep--;}result.add(maxTemp);}}
}

九、116. 填充每个节点的下一个右侧节点指针 - 力扣(LeetCode)

9.1题目

给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:

struct Node {int val;Node *left;Node *right;Node *next;
}

填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL

初始状态下,所有 next 指针都被设置为 NULL

示例 1:

输入:root = [1,2,3,4,5,6,7]
输出:[1,#,2,3,#,4,5,6,7,#]
解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。序列化的输出按层序遍历排列,同一层节点由 next 指针连接,'#' 标志着每一层的结束。

示例 2:

输入:root = []
输出:[]

9.2思路分析

每个node左子树的next就是node的右子树,每个node右子树的next就是node.next的左子树

9.3代码实现

/*
// Definition for a Node.
class Node {public int val;public Node left;public Node right;public Node next;public Node() {}public Node(int _val) {val = _val;}public Node(int _val, Node _left, Node _right, Node _next) {val = _val;left = _left;right = _right;next = _next;}
};
*/class Solution {public Node connect(Node root) {dfs(root, null);return root;}public void dfs(Node node ,Node next){if(node != null){node.next = next;dfs(node.left,node.right);dfs(node.right, node.next  != null ? node.next.left : null );}}
}

十、117. 填充每个节点的下一个右侧节点指针 II - 力扣(LeetCode)

10.1题目

给定一个二叉树:

struct Node {int val;Node *left;Node *right;Node *next;
}

填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL 。

初始状态下,所有 next 指针都被设置为 NULL 。

示例 1:

输入:root = [1,2,3,4,5,null,7]
输出:[1,#,2,3,#,4,5,7,#]
解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。序列化输出按层序遍历顺序(由 next 指针连接),'#' 表示每层的末尾。

示例 2:

输入:root = []
输出:[]

10.2思路分析

先进行层次遍历,然后将每层的头节点连起来,每层的末尾节点使其指向空

10.3代码实现

/*
// Definition for a Node.
class Node {public int val;public Node left;public Node right;public Node next;public Node() {}public Node(int _val) {val = _val;}public Node(int _val, Node _left, Node _right, Node _next) {val = _val;left = _left;right = _right;next = _next;}
};
*/
// 层序遍历,并将每次的头节点用链表连接起来
class Solution {public Node connect(Node root) {// 定义一个节点放置头指针Node ans = root;if(root == null) return ans;Queue <Node> queue = new LinkedList<>();queue.offer(root);while(!queue.isEmpty()){int size = queue.size();while(size-->0){Node temp = queue.poll();// 当size为0时temp.next指向空指针if(size!=0)temp.next = queue.peek();if(temp.left!=null) queue.offer(temp.left);if(temp.right != null) queue.offer(temp.right);// size--;}}return ans;}
}

十一、104. 二叉树的最大深度 - 力扣(LeetCode)

11.1题目

给定一个二叉树 root ,返回其最大深度。

二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:3

示例 2:

输入:root = [1,null,2]
输出:2

11.2思路分析

定义一个变量用来统计层深

11.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;*     }* }*/
class Solution {public int maxDepth(TreeNode root) {int deep = 0;if(root == null) return deep;Queue <TreeNode> queue = new LinkedList<>();queue.offer(root);while(!queue.isEmpty()){int size = queue.size();while(size>0){TreeNode temp = queue.poll();if(temp.left!=null) queue.offer(temp.left);if(temp.right!=null) queue.offer(temp.right);size--;}deep++;}return deep; }
}

十二、111. 二叉树的最小深度 - 力扣(LeetCode)

12.1题目

给定一个二叉树,找出其最小深度。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

说明:叶子节点是指没有子节点的节点。

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:2

示例 2:

输入:root = [2,null,3,null,4,null,5,null,6]
输出:5

12.2思路分析

当左节点与右节点同时为空时,此时为最短的路径

12.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;*     }* }*/
class Solution {public int minDepth(TreeNode root) {int deep = 1;Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);while(!queue.isEmpty()){int size = queue.size();while(size>0){TreeNode temp = queue.poll();if(temp == null) return 0;if(temp.left == null && temp.right == null){return deep;}if(temp.left!=null) queue.offer(temp.left);if(temp.right!= null) queue.offer(temp.right);size--;}deep++;}return deep;}
}

十三、226. 翻转二叉树 - 力扣(LeetCode)

13.1题目

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

示例 1:

输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]

示例 2:

输入:root = [2,1,3]
输出:[2,3,1]

示例 3:

输入:root = []
输出:[]

13.2思路分析

方法一递归

方法二迭代

13.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;*     }* }*/
class Solution {public TreeNode invertTree(TreeNode root) {if(root == null) return root;// 采用前序遍历// 交换左右孩子TreeNode temp = root.left;root.left = root.right;root.right = temp;// 对坐孩子进行遍历invertTree(root.left);invertTree(root.right);return root;}}
后序
/*** 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;*     }* }*/
class Solution {public TreeNode invertTree(TreeNode root) {if(root == null) return root;// 采用后序遍历// 先对孩子进行遍历invertTree(root.left);invertTree(root.right);// 交换左右孩子TreeNode temp = root.left;root.left = root.right;root.right = temp;return root;}}

方法二迭代

前序
/*** 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;*     }* }*/
class Solution {public TreeNode invertTree(TreeNode root) {if(root == null) return root;Stack<TreeNode> stack = new Stack<>();stack.push(root);while(!stack.isEmpty()){int size = stack.size();TreeNode temp = stack.pop();TreeNode temp1 = temp.left;temp.left = temp.right;temp.right = temp1;if(temp.right != null) stack.push(temp.right);if(temp.left!= null) stack.push(temp.left);}return root;}}
后续
/*** 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;*     }* }*/
class Solution {public TreeNode invertTree(TreeNode root) {if(root == null) return root;Stack<TreeNode> stack = new Stack<>();stack.push(root);while(!stack.isEmpty()){int size = stack.size();TreeNode temp = stack.pop();if(temp.right != null) stack.push(temp.right);if(temp.left!= null) stack.push(temp.left);TreeNode temp1 = temp.left;temp.left = temp.right;temp.right = temp1;}return root;}}
层序
/*** 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;*     }* }*/
class Solution {public TreeNode invertTree(TreeNode root) {if(root == null) return root;Queue<TreeNode> queue = new LinkedList<>();TreeNode node,temp;queue.offer(root);while(!queue.isEmpty()){int size = queue.size();while(size>0){temp = queue.poll();// 交换节点的左右子节点node = temp.left;temp.left = temp.right;temp.right = node; if(temp.left!= null) queue.offer(temp.left);if(temp.right!=null) queue.offer(temp.right);size--;}}return root;}
}

十四、101. 对称二叉树 - 力扣(LeetCode)

14.1题目

给你一个二叉树的根节点 root , 检查它是否轴对称。

示例 1:

输入:root = [1,2,2,3,4,4,3]
输出:true

示例 2:

输入:root = [1,2,2,null,3,null,3]
输出:false

14.2思路分析

方法一递归

方法二迭代

首先要比较的顺序,有叶子节点向根节点比较,同时叶子节点再比较时,应该分为外侧的两个节点进行比较与内侧两个节点比较,如果两次比较的结果完全相同才是完全相同的。

比较的几个规则:

左侧不为空且右侧为空时,不对称;

左侧为空且右侧不为空时,不对称;

左侧和右侧都为空时,需要进一步判断下一个节点;

左侧右侧都不为空,且左侧的值与右侧的值不相等时,不对称。

14.4代码实现

方法一递归

/*** 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;*     }* }*/
class Solution {public boolean isSymmetric(TreeNode root) {return compare(root.left,root.right);}public boolean compare(TreeNode left,TreeNode right){if(left == null && right != null) return false;if(left != null && right == null) return false;if(left == null && right == null) return true;if(left.val != right.val) return false;boolean outside = compare(left.left,right.right);boolean inseide = compare(left.right,right.left);return outside && inseide;}
}

方法二迭代

/*** 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;*     }* }*/
class Solution {public boolean isSymmetric(TreeNode root) {Stack<TreeNode> stack= new Stack<>();// 将左节点与右节点分辨传入到栈中stack.push(root.left);stack.push(root.right);while(!stack.isEmpty()){TreeNode right = stack.pop();TreeNode left = stack.pop();if(right != null && left == null) return false;if(right == null && left != null) return false;if(right == null && left == null) continue;if(right.val != left.val) return false;// 因为栈是先入后出// 所以先比较将内侧放入栈中,这样再比较时就是先比较外侧stack.push(left.right);stack.push(right.left);// 进一步比较外侧stack.push(left.left);stack.push(right.right);}return true;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/728498.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Python制作自己的wheel文件

平时自己利用Python制作一个个小工具后想分享给别人&#xff0c;但又嫌分享一堆项目代码很麻烦&#xff0c;那么你可以考虑将自己的项目打包成一个wheel文件&#xff0c;别人拿到文件后只需pip install安装即可使用&#xff0c;非常方便。 在上一篇博文中&#xff0c;利用nvid…

在maven多模块之间调用报错

错误信息为&#xff1a;不能解决maven_02_ssm项目的依赖问题&#xff0c;找不到maven_03_pojo这个jar包。 为什么找不到呢? 原因是Maven会从本地仓库找对应的jar包&#xff0c;但是本地仓库又不存在该jar包所以会报错。 在IDEA中是有maven_03_pojo这个项目&#xff0c;所以…

使用 Python 字典向 SQLite 插入数据

将Python字典数据插入SQLite数据库中其实有很多好处&#xff0c;例如使用字典的结构可以简化插入数据的代码&#xff0c;使其更加紧凑和易于理解。这降低了代码的复杂性&#xff0c;并使代码更易于维护。那么在我们日常使用中会有哪些问题呢&#xff1f;一起看看我是如何解决的…

华为配置DHCP Snooping防止DHCP Server仿冒者攻击示例

配置DHCP Snooping防止DHCP Server仿冒者攻击示例 组网图形 图1 配置DHCP Snooping防止DHCP Server仿冒者攻击组网图 DHCP Snooping简介配置注意事项组网需求配置思路操作步骤配置文件 DHCP Snooping简介 在一次DHCP客户端动态获取IP地址的过程中&#xff0c;DHCP Snoopi…

机器学习知识点复习 上(保研、复试、面试)百面机器学习笔记

机器学习知识点复习上 一、特征工程1. 为什么需要对数值类型的特征做归一化&#xff1f;2. 文本表示模型3. 图像数据不足的处理方法 二、模型评估1.常见的评估指标2.ROC曲线3.为什么在一些场景中要使用余弦相似度而不是欧氏距离&#xff1f;4.过拟合和欠拟合 三、经典算法1.支持…

✅ Windows11 系统 I 卡独显 A770 安装 深度学习 Pytorch 环境

&#x1f4cb; 文献参考 这里非常感谢知乎上的 ‘丢丢’ 的[**Windows系统下英特尔独显Pytorch的历程**] 为我提供了一开始的 I 卡安装想法&#xff01;但是文中并未介绍如何进行额外的环境变量操作问题&#xff0c;导致很多软件直接安装至系统盘&#xff0c;占用系统盘空间&am…

19.相机,棱镜和光场

一、成像方法 Imaging Synthesis Capture 1.Synthesis&#xff08;图形学上&#xff09;合成&#xff1a;比如之前学过的光线追踪或者光栅化 2.Capture&#xff08;捕捉&#xff09;&#xff1a;把真实世界存在的东西捕捉成为照片 二、相机 1.小孔成像 利用小孔成像的相…

【数据结构】矩阵的压缩存储

矩阵的压缩存储 5.1 普通矩阵的存储 用二维数组存储 分为行优先和列优先&#xff1a; 行优先&#xff1a;优先存放一行的数据。 列优先&#xff1a;优先存放一列的数据。 注意下标是从0还是1开始的&#xff01; 5.2 对称矩阵的存储 对称矩阵定义 若n阶方阵中任意一个元素 a i …

Sqoop “hcatalog does not exist!” 提示信息消除方法

sqoop运行的时候老是有这个报错提示&#xff0c;看着可烦&#xff0c;解决消除一下 解决方法&#xff1a; 1、在$SQOOP_HOME/bin目录下面修改configure-sqoop文件 1&#xff09;进文件夹 cd /training/sqoop-1.4.7/bin2&#xff09;编辑文件 vi /configure-sqoop3&#xff…

K8s Pod控制器

目录 前言&#xff1a; 1.Deployment 查看控制器配置 查看历史版本 2.SatefulSet 安装CoreDNS&#xff0c;仅二进制部署环境需要安装CoreDNS 方法一 方法二 查看statefulset的定义 清单定义StatefulSet 创建pv 定义PV 创建statefulset 滚动更新 总结 扩展伸缩…

【MySQL | 第三篇】MySQL索引及两种索引分类方法总结

文章目录 3.MySQL索引及两种索引分类方法3.1索引的概念3.1.1相关定义3.1.2查询例子 3.2索引的底层3.2.1二叉树&#xff08;1&#xff09;满二叉树&#xff08;2&#xff09;完全二叉树&#xff08;3&#xff09;二叉查找树&#xff08;4&#xff09;二叉平衡树&#xff08;AVL&…

HTML静态网页成品作业(HTML+CSS)——电影网首页网页设计制作(1个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有1个页面。 二、作品演示 三、代…

Vue3_2024_6天【回顾上篇watch常见的前三种场景】另两种待补

第一种情况&#xff1a;监视【ref】定义&#xff08;基本数据类型&#xff09; 1.引入watch2.格式&#xff1a;watch&#xff08;基本数据类型数据&#xff0c;监视变化的回调函数&#xff09; 注意点&#xff1a; 2.1.watch里面第一个参数&#xff0c;是数据~~【监视的基本类…

[Buuctf] [MRCTF2020] Xor

运行 1.查壳 32位exe文件&#xff0c;没有壳 2.用32位IDA打开 找到main函数&#xff0c;F5查看伪代码&#xff0c;但是这里会弹出一个窗口 函数分析失败&#xff01;&#xff01; 这里我在看别人的题解时发现一种玄学方式解决了这个问题 窗口里面弹出了一个地址401095&…

LVS+Keepalived 高可用负载均衡集群

一. 高可用集群的相关知识 1.1 高可用&#xff08;HA&#xff09;集群和普通集群的比较 ① 普通集群 普通的群集的部署是通过一台度器控制调配多台节点服务器进行业务请求的处理&#xff0c;但是仅仅是一台调度器&#xff0c;就会存在极大的单点故障风险&#xff0c;当该调度…

蓝桥杯备赛之二分专题

常用的算法二分模板 1. 在数组a[]中找大于等于x的第一个数的下标 //int ans lower_bound(a, a n, x) - a //相当于下方 int l 0, r n - 1; while(l < r) {int mid l r >> 1;if(a[mid] > x) r mid;else l mid 1; } cout << r;2. 在数组a[]中找大于…

qml中toolbox控件、ComboBox控件、PlainText实现及美化

一. 内容简介 qml中toolbox控件、ComboBox控件、PlainText实现及美化 二. 软件环境 2.1vsCode 2.2Anaconda version: conda 22.9.0 2.3pytorch 安装pytorch(http://t.csdnimg.cn/GVP23) 2.4QT 5.14.1 新版QT6.4,&#xff0c;6.5在线安装经常失败&#xff0c;而5.9版本…

亚马逊运营要使用什么海外代理IP?

代理IP作为网络活动的有力工具&#xff0c;同时也是跨境电商的必备神器。亚马逊作为跨境电商的头部平台&#xff0c;吸引了大量的跨境电商玩家入驻&#xff0c;想要做好亚马逊&#xff0c;养号、测评都需要代理IP的帮助。那么应该使用什么代理IP呢&#xff1f;如何使用&#xf…

JS-02-javaScript快速入门

一、javaScript代码的编写位置 JavaScript代码可以直接嵌在网页的任何地方&#xff0c;但是一般&#xff0c;我们用如下编写方式。 1-1、直接写到HTML文件中 通常我们都把JavaScript代码放到<head>中&#xff0c;由<script>...</script>包含的代码就是Java…

【深度学习】1. 深度学习概述

感知器模型 人脑中的神经元:一个神经元通常具有多个树突&#xff0c;主要用来接受传入信息;而轴突只有一条&#xff0c;轴突尾端有许多轴突末梢可以给其他多个神经元传递信息。轴突末梢跟其他神经元的树突产生连接&#xff0c;从而传递信号。 而在计算机的神经网络中&#xff…