相同的樹
思路 和對(duì)稱二叉樹整體代碼邏輯基本相同,只不過在比較的時(shí)候愧沟,比較的不再是同一棵樹內(nèi)側(cè)和外側(cè)。而是兩棵不同樹的同側(cè) 左側(cè)和左側(cè)比 右側(cè)和右側(cè)比 更改幾行代碼即可
class Solution {
public boolean isSameTree(TreeNode p, TreeNode q) {
Deque<TreeNode> deque = new LinkedList<>();
deque.add(p);
deque.add(q);
while (!deque.isEmpty()){
TreeNode left = deque.poll();
TreeNode right= deque.poll();
// 如果比較的節(jié)點(diǎn)為空 則跳到下一輪比較
if (left == null && right == null){
continue;
}
// 能進(jìn)入這一步的left和right一定不全為空
if (left == null || right == null || left.val != right.val){
return false;
}
// 加入節(jié)點(diǎn)進(jìn)行比較 同側(cè)的節(jié)點(diǎn)為比較節(jié)點(diǎn)
deque.offer(left.left);
deque.offer(right.left);
deque.offer(left.right);
deque.offer(right.right);
}
return true;
}
}
另一顆數(shù)的子樹
思路:在上一道題的基礎(chǔ)上 把兩顆完整樹的比較變成了一棵樹和另外一棵樹子數(shù)的比較,只需要在上一題的基礎(chǔ)上增加一個(gè)遍歷的操作,當(dāng)遍歷到需要比較的節(jié)點(diǎn)腾节,就進(jìn)行比較。
class Solution {
public boolean isSubtree(TreeNode root, TreeNode subRoot) {
// 找到比較的入口點(diǎn)
Deque<TreeNode> deque = new LinkedList<>();
// if (root == null) return root;
deque.add(root);
while (!deque.isEmpty()){
int size = deque.size();
for (int i = 0; i < size; i++) {
TreeNode node = deque.poll();
// 遇到開頭相同的 就進(jìn)行比較 正確就直接返回 不正確繼續(xù)尋找下一個(gè)比較點(diǎn)
if(node.val == subRoot.val){
if(compare(node,subRoot)){
return true;
}
}
if (node.left != null) deque.add(node.left);
if (node.right != null) deque.add(node.right);
}
}
return false;
}
// 進(jìn)行比較是否相同的遞歸函數(shù)
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;
return compare(left.left,right.left) && compare(left.right,right.right);
}
}
完全二叉樹的節(jié)點(diǎn)個(gè)數(shù)
思路:完全二叉樹也是一棵樹 按照層序遍歷的方式加上計(jì)數(shù)器記錄個(gè)數(shù) 最后返回即可
class Solution {
public int countNodes(TreeNode root) {
// 添加計(jì)數(shù)器 層序遍歷記錄個(gè)數(shù)即可
Deque<TreeNode> deque = new LinkedList<>();
if (root == null) return 0;
deque.add(root);
int res = 0;
while (!deque.isEmpty()){
int size = deque.size();
for (int i = 0; i < size; i++) {
TreeNode node = deque.poll();
// 彈出節(jié)點(diǎn)的時(shí)候計(jì)數(shù)器加一
res++;
if (node.left != null){
deque.add(node.left);
}
if (node.right != null){
deque.add(node.right);
}
}
}
return res;
}
}
更簡(jiǎn)潔的遞歸方法 不斷分割為 左右子樹的個(gè)數(shù)加上根節(jié)點(diǎn)的個(gè)數(shù)
if (root == null) return 0;
return countNodes(root.left) + countNodes(root.right) + 1;