day5
求一棵树的最大深度
深度优先遍历
对于左子树和右子树进行递归,如果哪个值比较大,我们就可以进行保存,值得注意的是,我们应该将这一轮的值进行保存1
2
3
4
5
6
7
8
9
10
11
12class Solution {
public int maxDepth(TreeNode root) {
if(root==null){
return 0;
}
else{
int leftHeight=maxDepth(root.left);
int rightHeight=maxDepth(root.right);
return Math.max(leftHeight,rightHeight)+1;
}
}
}正统dfs想法和我第一遍想的一样,写不出来hhhhh
其中极端情况去想这个递归的是,我们只有一颗全部是左子树的树,这时候我们就要不停的向左走,如果走到头我们就要进行回退进行判断
另外,如果只有一个节点的,我们就想要进行判断是否是叶子节点,这时候我们期望的是返回节点,进行判断父节点是否有兄弟1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18class Solution {
int height = 0;
int ans = 0;
public int maxDepth(TreeNode root) {
traverse(root);
return ans;
}
public void traverse(TreeNode root){
if(root==null){
return;
}
height ++;
ans = Math.max(ans,height);
traverse(root.left);
traverse(root.right);
height--;
}
}层序遍历
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21class Solution {
public int maxDepth(TreeNode root) {
if(root==null)
return 0;
List<TreeNode> queue = new LinkedList<>(),temp;//注意声明
int ans = 0;
queue.add(root);
while(!queue.isEmpty()){
temp = new LinkedList<>();
for(TreeNode treeNode : queue){
if(treeNode.left!=null)
temp.add(treeNode.left);
if(treeNode.right!=null)
temp.add(treeNode.right);
}
queue = temp;
ans++;
}
return ans;
}
}
对称二叉树
- 使用栈完成,思想和递归类似,但是脑子想不清楚,fufufufuffuf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35import java.util.LinkedList;
class Solution {
public boolean isSymmetric(TreeNode root) {
if (root == null) {
return true;
}
LinkedList<TreeNode> nstack = new LinkedList<>();
nstack.push(root.left);
nstack.push(root.right);
while (!nstack.isEmpty()) {
TreeNode right = nstack.pop();
TreeNode left = nstack.pop();
if (right == null && left == null) {
continue;
}
if (right == null || left == null || right.val != left.val) {
return false;
}
// 对称位置的节点入栈,注意入栈顺序
nstack.push(left.left);
nstack.push(right.right);
nstack.push(left.right);
nstack.push(right.left);
}
return true;
}
} - 每次看了递归只能喵喵喵的叫,
1. 添加跳出循环的条件1
2
3
4
5
6
7
8
9
10
11
12
13
14
15class Solution {
public boolean isSymmetric(TreeNode root) {
return isSymmetric(root, root);
}
public boolean isSymmetric(TreeNode node1, TreeNode node2) {
if (node1 == null && node2 == null) {
return true;
}
if (node1 == null || node2 == null || node1.val != node2.val) {
return false;
}
return isSymmetric(node1.left, node2.right) && isSymmetric(node1.right, node2.left);
}
}
- 使用栈完成,思想和递归类似,但是脑子想不清楚,fufufufuffuf
总结一下:
使用 ArrayList 实现队列和栈队列操作:
加入元素: 使用 add 方法将元素添加到 ArrayList 的末尾。1
2
3Copy code
ArrayList<TreeNode> queue = new ArrayList<>();
queue.add(element);删除元素: 使用 remove(0) 方法移除第一个元素。
1 | Copy code |
加入元素: 使用 add 方法将元素添加到 ArrayList 的末尾。
1 | Copy code |
删除元素: 使用 remove(size - 1) 方法移除最后一个元素。
1 | Copy code |
队列操作:
加入元素: 使用 offer 方法将元素添加到 LinkedList 的末尾。
1 | Copy code |
删除元素: 使用 poll 方法移除并返回第一个元素。
1 | Copy code |
栈操作:
加入元素: 使用 addFirst 或 push 方法将元素添加到 LinkedList 的开头。
1 | Copy code |
删除元素: 使用 removeFirst 或 pop 方法移除并返回第一个元素。
1 | Copy code |
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Comment
WalineFacebook Comments