题库
一、二叉树的层序遍历
给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。原题
广度优先和队列解法
建立集合存储最终数据,建立队列暂时存储数据。按从根到叶,从左到右的顺序遍历二叉树,把访问到的结点的值和左子结点的值,右子结点的值依次加入队列,然后再取出加入集合。
代码如下:
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> st = new ArrayList<List<Integer>>();
if(root == null)
return st;
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.offer(root);
while(!queue.isEmpty()) {
List<Integer> level = new ArrayList<Integer>();
int leveSize = queue.size();
for(int i = 1;i <= leveSize;i++) {
TreeNode node = queue.poll();
level.add(node.val);
if(node.left != null)
queue.offer(node.left);
if(node.right != null)
queue.offer(node.right);
}
st.add(level);
}
return st;
}
二、二叉树的最大深度
给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。原题
递归解法
通过每次递归当前结点的左子树和右子树的深度进行比较,取其中较大的一个返回。当访问到叶子结点时,返回 0 .
代码如下:
public int maxDepth(TreeNode root) {
return diGui(root);
}
public int diGui(TreeNode root) {
if(root == null)
return 0;
int leftMax = diGui(root.left);
int rightMax = diGui(root.right);
return (leftMax > rightMax ? leftMax:rightMax)+1;
}
三、对称二叉树
给你一个二叉树的根节点 root , 检查它是否轴对称。原题
递归解法
通过观察可以得知,对称的二叉树满足几个条件:1.左子结点与右子结点相等。2.左子结点的右子树和右子结点的左子树内容相等。
代码如下:
public boolean isSymmetric(TreeNode root) {
return check(root,root);
}
public boolean check(TreeNode left,TreeNode right) {
if(left == null && right == null)
return true;
if(left == null || right == null)
return false;
return left.val == right.val && check(left.left,right.right) && check(left.right,right.left);
}
总结
基于二叉树的特点,在做题时可以优先考虑递归思维。