1. 对称二叉树
描述:
给定一个二叉树,检查它是否是镜像对称的。
思路:
(1)定义一个辅助方法isSymmetricChild,返回左孩子和右孩子是否对称
(2)若root为空,认为对称返回true
(3)方法isSymmetricChild,若左右子树都为空,返回true
若左右子树一个为空或值不同都返回false
(4)若当前左右子树都不空且值相同,递归左子树的左孩子和右子树的右孩子(对称),
递归左子树的右孩子和右子树的左孩子(对称),都为true则返回true
(5)返回 isSymmetricChild 参数为当前根的左右孩子
代码:
class Solution {
public boolean isSymmetric(TreeNode root) {
if(root == null) return true;
return isSymmetricChild(root.left, root.right);
}
public boolean isSymmetricChild(TreeNode leftTree, TreeNode rightTree){
if(leftTree == null && rightTree == null) return true;
if(leftTree == null && rightTree != null || leftTree != null && rightTree == null
|| leftTree.val != rightTree.val) return false;
return isSymmetricChild(leftTree.left, rightTree.right) &&
isSymmetricChild(leftTree.right, rightTree.left);
}
}
改进: if(leftTree == null || rightTree == null || leftTree.val != rightTree.val) return false;
代码到这一行代表两个子树不可能同时为空,所以一个为空或另一个为空就可以了
2. 二叉树层序遍历
描述:
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)
思路:
先进先出,考虑使用队列
(1)先定义返回值ret(二维List集合),若根为空,返回ret
(2)定义需要使用的队列,把根节点入队
(3)循环若进行队列不为空,定义变量size获取当前队列长度(也就是当前层的节点)
(4)定义一个一维List集合保存当前层的的节点,循环进行若size!=0,把当前节点出队并保存到List中,在判断若有左右孩子节点则孩子节点入队,size--(一次出队一个)
(5)内层循环结束代表当前层遍历完毕,让ret保存list
(6)外层循环结束代表队列空了,也就遍历完了,返回ret
代码:
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> ret = new ArrayList<>();
if(root == null) return ret;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while(!queue.isEmpty()){
int size = queue.size();
List<Integer> list = new ArrayList<>();
while(size != 0){
TreeNode cur = queue.poll();
list.add(cur.val);
if(cur.left != null){
queue.offer(cur.left);
}
if(cur.right != null){
queue.offer(cur.right);
}
size--;
}
ret.add(list);
}
return ret;
}
}
3. 构造二叉树
描述:
编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果
思路:
按照先序遍历构造二叉树的思路:
(1)定义一个i来遍历给定的字符串,初始化根节点root
(2)判断若i下标的字符不为#,把当前字符赋给root,i后移,递归左右孩子节点,否则i直接后移
(3)返回root就是当前下标指向的节点
代码:
import java.util.Scanner;
class TreeNode{
public char val;
public TreeNode left;
public TreeNode right;
public TreeNode(char val){
this.val = val;
}
}
public class Main{
public static int i = 0;
public static TreeNode creatTree(String str){
TreeNode root = null;
if(str.charAt(i) != '#'){
root = new TreeNode(str.charAt(i));
i++;
root.left = creatTree(str);
root.right = creatTree(str);
}else{
i++;
}
return root;
}
public static void inorder(TreeNode root){
if(root == null) return;
inorder(root.left);
System.out.print(root.val + " ");
inorder(root.right);
}
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
String str = scan.nextLine();
TreeNode root = creatTree(str);
inorder(root);
}
}