此博客鏈接:
二叉樹的堂兄弟節點
題目鏈接:https://leetcode-cn.com/problems/cousins-in-binary-tree/
在二叉樹中,根節點位於深度 0 處,每個深度為 k 的節點的子節點位於深度 k+1 處。
如果二叉樹的兩個節點深度相同,但父節點不同,則它們是一對堂兄弟節點。
我們給出了具有唯一值的二叉樹的根節點 root,以及樹中兩個不同節點的值 x 和 y。
只有與值 x 和 y 對應的節點是堂兄弟節點時,才返回 true。否則,返回 false。
示例 1:
輸入:root = [1,2,3,4], x = 4, y = 3
輸出:false
示例 2:
輸入:root = [1,2,3,null,4,null,5], x = 5, y = 4
輸出:true
示例 3:
輸入:root = [1,2,3,null,4], x = 2, y = 3
輸出:false
題解:
思路:
1.層次遍歷,把根節點的左右孩子存入到隊列中,然后從隊列中取出節點,判斷給定的x,y有沒有在第二層在,只要有一個在第二層上,就返回false。
2.如果給的節點不在第二層,且在同一層上,並且節點不是同一個父親,則返回true。
方法:層次遍歷,判斷每個節點的左右孩子節點是否是給的x,y,如果不是,把一層的節點存到一個列表中,然后判斷x,y是否在這一層中,如果在一層中,只包含一個x或者y,則返回false。
說明:
我是采取把不合法的情況排除,那剩下的局勢合法的,首先同一個父親的節點的兩個數據排除,其次不在同一層的數據排除。剩下的全是合法的數據。
代碼:
class Solution { public boolean isCousins(TreeNode root, int x, int y) { Queue<TreeNode> queue=new LinkedList(); if(root.left!=null&&root.right!=null) if(root.left.val==x||root.left.val==y||root.right.val==x||root.right.val==y) return false; if(root.left==null||root.right==null) return false; queue.add(root); //queue.add(root.right); while(!queue.isEmpty()) { int len=queue.size(); List<Integer> list=new LinkedList(); for(int i=0;i<len;i++) { TreeNode temp=queue.poll(); list.add(temp.val); if(temp.left!=null&&temp.right!=null) if((temp.left.val==x&&temp.right.val==y)||(temp.left.val==y&&temp.right.val==x)) { return false; } if(temp.left!=null) { queue.add(temp.left); } if(temp.right!=null) { queue.add(temp.right); } } if(list.contains(x)) { if(!list.contains(y)) return false; } } return true; } }