二叉树的堂兄弟节点
此博客链接:
二叉树的堂兄弟节点
题目链接: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; } }
出来混总是要还的