一、简单题
1 二叉树的中序遍历
【中序遍历】
二叉树的中序遍历:按照访问左子树——根节点——右子树的方式遍历这棵树 在访问左子树或者右子树的时候我们按照同样的方式遍历,直到遍历完整棵树
/**
* 递归
*
* @param root 表示当前遍历到root节点的答案
* @return {@link List<Integer>}
*/
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<Integer>();
inorder(root, res);
return res;
}
/**
* dfs
*
* @param root 根
* @param res res
*/
public void inorder(TreeNode root, List<Integer> res) {
//递归终止的条件为碰到空节点
if (root == null) {
return;
}
//递归调用 inorder(root.left) 来遍历root节点的左子树
inorder(root.left, res);
//将root节点的值加入答案
res.add(root.val);
//再递归调用inorder(root.right)来遍历 root节点的右子树
inorder(root.right, res);
}
2 相同的树
/**
* dfs
*
* @param p 树1
* @param q 树2
* @return boolean 是否相同
*/
public boolean isSameTree(TreeNode p, TreeNode q) {
if (p == null && q == null){
return true;
}else if(p == null || q == null){
return false;
}else if (p.val != q.val) {
return false;
}else {
return isSameTree(p.left,q.left) && isSameTree(p.right,q.right);
}
}
3 对称二叉树
/**
* 如果一个树的左子树与右子树镜像对称,那么这个树是对称的。
*
* 如果同时满足下面的条件,两个树互为镜像:
* 1.它们的两个根结点具有相同的值
* 2.每个树的右子树都与另一个树的左子树镜像对称
*
* @param root 根
* @return boolean
*/
public boolean isSymmetric(TreeNode root) {
if (root == null) {
return true;
}
return dfs(root.left, root.right);
}
public boolean dfs(TreeNode left, TreeNode right) {
if (left == null && right == null) {
return true;
} else if (left == null || right == null) {
return false;
} else if (left.val != right.val) {
return false;
} else {
// 左子树的左&右子树的右 右子树的左&左子树的右
return dfs(left.left, right.right) && dfs(left.right, right.left);
}
}