目录
前言
1.平衡二叉树
2.对称二叉树
3.二叉树遍历
4.层序遍历
5.判断一棵树是不是完全二叉树
前言
编程想要学的好,刷题少不了,我们不仅要多刷题,还要刷好题!为此我开启了一个弯道超车必做好题锦集的系列,此为二叉树面试题第二篇,每篇大约5题左右。该系列会不定期更新,敬请期待!
1.平衡二叉树
110. 平衡二叉树https://leetcode.cn/problems/balanced-binary-tree/题目描述:
方法一:自顶向下的递归
对于当前遍历到的节点,首先计算左右子树的高度,如果左右子树的高度差<= 1,再分别递归遍历左右子节点,并判断左子树和右子树是否平衡。这是一个自顶向下的递归的过程。
步骤:
利用递归思想进行逐个遍历,时间复杂度较高,为O(N^2)
代码:
class Solution {
public int maxDepth(TreeNode root) {
if (root == null) {
return 0;
}
int leftHeight = maxDepth(root.left);
int rightHeight = maxDepth(root.right);
return (leftHeight > rightHeight) ?
(leftHeight + 1) : (rightHeight + 1);
}
public boolean isBalanced(TreeNode root) {
if (root == null) {
return true;
}
int hleft=maxDepth(root.left);
int hright=maxDepth(root.right);
return Math.abs(hleft-hright)<=1&&
isBalanced(root.left)&&isBalanced(root.right);
}
}
方法二:自底向上的递归
对于当前遍历到的节点,先递归地判断其左右子树是否平衡,再判断以当前节点为根的子树是否平衡。如果一棵子树是平衡的,则返回其高度(高度一定是非负整数),否则返回 −1。如果存在一棵子树不平衡,则整个二叉树一定不平衡。
代码:
class Solution {
public int maxDepth2(TreeNode root) {
if (root == null) {
return 0;
}
int leftHeight = maxDepth2(root.left);
if (leftHeight < 0) {
return -1;
}
int rightHeight = maxDepth2(root.right);
if(leftHeight>=0&&rightHeight>=0&&
Math.abs(leftHeight-rightHeight)<=1){
return Math.max(leftHeight, rightHeight) + 1;
}else {
return -1;
}
}
public boolean isBalanced(TreeNode root) {
return maxDepth2(root)>=0;
}
}
2.对称二叉树
对称二叉树https://leetcode.cn/problems/symmetric-tree/题目描述:
方法:递归
(1)如果一个树是空树,这个树是对称的。
(2)如果一个非空树的左子树与右子树完全相同,那么这个树是对称的。
代码:
class Solution {
public boolean issymmetric(TreeNode l,TreeNode r) {
if(l != null&&r == null || l == null && r != null) {
return false;
}
if(l == null && r == null ) {
return true;
}
if(l.val != r.val ) {
return false;
}
return issymmetric(l.left,r.right) && issymmetric(l.right,r.left);
}
public boolean isSymmetric(TreeNode root) {
if(root==null){
return true;
}
return issymmetric(root.left,root.right);
}
}
3.二叉树遍历
思路:
代码:
import java.util.Scanner;
class TreeNode1{
public char val;
public TreeNode1 left;
public TreeNode1 right;
public TreeNode1(char val) {
this.val = val;
}
}
public class Main {
public static int i = 0;
public static TreeNode1 createTree(String str){
TreeNode1 root = null;
if (str.charAt(i) != '#') {
root = new TreeNode1(str.charAt(i));
i++;
root.left = createTree(str);
root.right = createTree(str);
} else {
i++;
}
return root;
}
public static void inOrderTraversal(TreeNode1 root){
if (root == null) {
return;
}
inOrderTraversal(root.left);
System.out.print(root.val+" ");
inOrderTraversal(root.right);
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
while (scan.hasNextLine()) {
String str = scan.nextLine();
TreeNode1 root = createTree(str);
inOrderTraversal(root);
}
}
}
4.层序遍历
何为层序遍历?
设二叉树的根节点所在 层数为1 ,层序遍历就是从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第 2 层 上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历。
102. 二叉树的层序遍历https://leetcode.cn/problems/binary-tree-level-order-traversal/
题目描述:
解析:
在遍历每一行的节点队列时,将该行每个节点的非空子节点添加到队列中,直到遍历到最后一行时,没有子节点再入队列,结束循环。
代码:
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> lists = new ArrayList<>();
if(root==null){
return lists;
}
Queue<TreeNode> queue=new LinkedList<>();
queue.offer(root);
while(!queue.isEmpty()){
ArrayList<Integer> tmp = new ArrayList<>();
int size=queue.size();
while (size>0){
TreeNode cur=queue.poll();
tmp.add(cur.val);
size--;
if(cur.left!=null){
queue.add(cur.left);
}
if(cur.right!=null){
queue.add(cur.right);
}
}
lists.add(tmp);
}
return lists;
}
}
5.判断一棵树是不是完全二叉树
解析:
定义一个队列,先将根结点入队,如果队列不为空我们就进入循环,将队列的元素进行出栈并赋给cur变量,如果cur不等于null,我们就将cur的左树和右树进行入队,如果cur为null则跳出循环,这时候我可以将队列进行出队,元素全部为null,则为完全二叉树。
代码:
public boolean isCompleteTree(TreeNode root){
if(root == null) {
return true;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while (queue.isEmpty()){
TreeNode cur=queue.poll();
if(cur!=null){
queue.offer(cur.left);
queue.offer(cur.right);
}else{
break;
}
}
while (!queue.isEmpty()) {
TreeNode tmp = queue.poll();
if(tmp != null) {
return false;
}
}
return true;
}
以上为我个人的小分享,如有问题,欢迎讨论!!!
都看到这了,不如关注一下,给个免费的赞