这道题是一道简单题,但对于我来说从这道题得到的收获还是蛮多的
- 递归 只需要考虑当前p q是否都为空 或者是否都相同 之后重复调用即可
public boolean isSameTree(TreeNode p,TreeNode q){
if( p == null && q == null) return true;
if(p !=null && q != null && p.val == q.val) {
return isSameTree(p.left,q.left) && isSameTree(p.right,q.right);
}
return false;
}
2. 序列化 先序列化为字符串 然后再进行比较
public boolean isSameTree(TreeNode p, TreeNode q) {
String strP = toSequence(p);
String strQ = toSequence(q);
return strP.equals(strQ);
}
public String toSequence(TreeNode root){
if(root == null) return "#";
String res = root.val + "!";
res+= toSequence(root.left);
res+= toSequence(root.right);
return res;
}
后面看别人的提交记录的时候看到有人用双队列写 但感觉有些麻烦 看到有个层序遍历,想想自己对层序遍历有些不熟 下面就记下来
- 层序遍历非递归 利用队列实现
public void BFS(TreeNode root){
Queue<TreeNode> queue = new ArrayDeque<>();
queue.add(root);
while(!queue.isEmpty()){
TreeNode poll = queue.poll();
System.out.println(poll + " ");
if(poll.left !=null){
queue.add(poll.left);
}
if(poll.right !=null){
queue.add(poll.right);
}
}
}
- 层序遍历递归
public static void levelOrder(TreeNode Node) {
if (Node == null) {
return;
}
int depth = depth(Node);
for (int i = 1; i <= depth; i++) {
levelOrder(Node, i);
}
}
private static void levelOrder(TreeNode Node, int level) {
if (Node == null || level < 1) {
return;
}
if (level == 1) {
System.out.print(Node.val + " ");
return;
}
// 左子树
levelOrder(Node.left, level - 1);
// 右子树
levelOrder(Node.right, level - 1);
}
public static int depth(TreeNode Node) {
if (Node == null) {
return 0;
}
int l = depth(Node.left);
int r = depth(Node.right);
if (l > r) {
return l + 1;
} else {
return r + 1;
}
}