层序遍历
层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树。这种遍历的方式和我们之前讲过的都不太一样。
需要借用一个辅助数据结构即队列来实现,队列先进先出,符合一层一层遍历的逻辑,而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。
而这种层序遍历方式就是图论中的广度优先遍历
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> resList = new ArrayList<List<Integer>>();
Queue<TreeNode> deque = new LinkedList<TreeNode>();
deque.offer(root);
while (!deque.isEmpty()){
List<Integer> result=new ArrayList<Integer>();
int size=deque.size();
while (size>0){
TreeNode node = deque.poll();
result.add(node.val);
if (node.left!=null) deque.offer(node.left);
if (node.right!=null) deque.offer(node.right);
size--;
}
resList.add(result);
}
return resList;
翻转二叉树
遍历的过程中去翻转每一个节点的左右孩子就可以达到整体翻转的效果。
注意只要把每一个节点的左右孩子翻转一下,就可以达到整体翻转的效果
//DFS递归(深度)
public TreeNode invertTree(TreeNode root) {
invert(root);
return root;
}
private void invert(TreeNode root) {
if (root==null){
return;
}
TreeNode tempNode=root.left;
root.left=root.right;
root.right=tempNode;
invert(root.left);
invert(root.right);
对称二叉树
在递归遍历的过程中,要同时遍历两棵树。比较的是两个子树的里侧和外侧的元素是否相等
正是因为要遍历两棵树而且要比较内侧和外侧节点,所以准确的来说是一个树的遍历顺序是左右中,一个树的遍历顺序是右左中
public boolean isSymmetric(TreeNode root) {
return compare(root.left,root.right);
}
private boolean compare(TreeNode left, TreeNode right) {
if (left==null&&right==null){
return true;
}
if (left!=null&&right==null){
return false;
}
if (left==null&&right!=null){
return false;
}
if (left.val!=right.val){
return false;
}
boolean compareOut = compare(left.left, right.right);
boolean compareIn = compare(left.right, right.left);
return compareIn && compareOut;
}