【分析】这道题其实遍历一下二叉树就行了,二叉树遍历的方式有递归/迭代/层次三种,正好借此机会复习一下各种遍历方式。
【递归】
先序:
class Solution {
int val;
public boolean dfs(TreeNode node){
if(node == null) return true;
if(node.val != val) return false;
return dfs(node.left) && dfs(node.right);
}
public boolean isUnivalTree(TreeNode root) {
val = root.val;
return dfs(root);
}
}
中序:
class Solution {
int val;
public boolean dfs(TreeNode node){
if(node == null) return true;
boolean left = dfs(node.left);
if(node.val != val) return false;
return left && dfs(node.right);
}
public boolean isUnivalTree(TreeNode root) {
val = root.val;
return dfs(root);
}
}
后序:
class Solution {
int val;
public boolean dfs(TreeNode node){
if(node == null) return true;
boolean left = dfs(node.left);
boolean right = dfs(node.right);
return node.val == val && left && right;
}
public boolean isUnivalTree(TreeNode root) {
val = root.val;
return dfs(root);
}
}
【迭代】
先序:
class Solution {
public boolean isUnivalTree(TreeNode root) {
int val = root.val;
Deque<TreeNode> stack = new LinkedList();
stack.push(root);
while(!stack.isEmpty()){
TreeNode top = stack.poll();
if(top.val != val) return false;
if(top.right != null) stack.push(top.right);
if(top.left != null) stack.push(top.left);
}
return true;
}
}
中序:
class Solution {
public boolean isUnivalTree(TreeNode root) {
int val = root.val;
Deque<TreeNode> stack = new LinkedList();
stack.push(root);
Set<TreeNode> visit = new HashSet();
while(!stack.isEmpty()){
TreeNode top = stack.poll();
if(visit.contains(top)){
if(top.val != val) return false;
}
if(top.right != null) stack.push(top.right);
if(!visit.contains(top)) stack.push(top);
visit.add(top);
if(top.left != null) stack.push(top.left);
}
return true;
}
}
后序:
class Solution {
public boolean isUnivalTree(TreeNode root) {
int val = root.val;
Deque<TreeNode> stack = new LinkedList();
stack.push(root);
Set<TreeNode> visit = new HashSet();
while(!stack.isEmpty()){
TreeNode top = stack.poll();
if(visit.contains(top)){
if(top.val != val) return false;
}
if(!visit.contains(top)){
stack.push(top);
visit.add(top);
}
if(top.right != null) stack.push(top.right);
if(top.left != null) stack.push(top.left);
}
return true;
}
}
其中中序和后序都需要用一个visit来维护节点的输出顺序,只有当节点被访问过一次后才输出出来。
【层次 BFS】
不带层信息:
class Solution {
public boolean isUnivalTree(TreeNode root) {
int val = root.val;
Deque<TreeNode> queue = new LinkedList();
queue.offer(root);
while(!queue.isEmpty()){
TreeNode top = queue.poll();
if(top.val != val) return false;
if(top.left != null) queue.offer(top.left);
if(top.right != null) queue.offer(top.right);
}
return true;
}
}
带层信息:
class Solution {
public boolean isUnivalTree(TreeNode root) {
int val = root.val;
Deque<TreeNode> queue = new LinkedList();
queue.offer(root);
int d = 0;
while(!queue.isEmpty()){
int k = queue.size();
d++;
while(k-- > 0){
TreeNode top = queue.poll();
if(top.val != val) return false;
if(top.left != null) queue.offer(top.left);
if(top.right != null) queue.offer(top.right);
}
}
return true;
}
}