1. 二叉树前序遍历(重要)
前序遍历:中左右
思路:使用递归
注意点:定义全局变量List存储元素。开始使用数组存储,并作为递归方法的入参,实际结果是正常的,但是提交时通不过,而且数组写法更复杂,需要考虑数组长度等。
java
public class TreeSolution {
private List<Integer> list = new ArrayList<Integer>();
public int[] preorderTraversal(TreeNode root) {
if (root == null) {
return new int[0];
}
getPreorderTraversal(root);
int[] array = new int[list.size()];
for(int i = 0; i < list.size(); i++){
array[i] = list.get(i);
}
return array;
}
public List<Integer> getPreorderTraversal(TreeNode root) {
if (root != null) {
list.add(root.val);
getPreorderTraversal(root.left);
getPreorderTraversal(root.right);
}
return list;
}
}
2. 二叉树中序遍历(重要)
java
public class TreeSolution {
private List<Integer> list = new ArrayList<Integer>();
/**
* 中序遍历
* @param root
* @return
*/
public int[] inorderTraversal (TreeNode root) {
if (root == null) {
return new int[0];
}
getInorderTraversal(root);
int[] array = new int[list.size()];
for(int i = 0; i < list.size(); i++){
array[i] = list.get(i);
}
return array;
// write code here
}
/**
* 中序递归 左中右
* @param root
* @return
*/
public List getInorderTraversal(TreeNode root) {
if (root != null) {
getInorderTraversal(root.left);
list.add(root.val);
getInorderTraversal(root.right);
}
return list;
}
}
3. 二叉树后续遍历(重要)
java
public class TreeSolution {
private List<Integer> list = new ArrayList<Integer>();
/**
* 后续遍历
* @param root
* @return
*/
public int[] postorderTraversal (TreeNode root) {
if (root == null) {
return new int[0];
}
getPostorderTraversal(root);
int[] array = new int[list.size()];
for(int i = 0; i < list.size(); i++){
array[i] = list.get(i);
}
return array;
}
/**
* 后序递归 左右中
* @param root
* @return
*/
public List getPostorderTraversal(TreeNode root) {
if (root != null) {
getInorderTraversal(root.left);
getInorderTraversal(root.right);
list.add(root.val);
}
return list;
}
}
4. 二叉树层次遍历&&分层展示(重要)
注意,最后一层是空集合,空集合不要放到最终结果中。
java
public class Solution {
private ArrayList<ArrayList<TreeNode>> treeNodes = new ArrayList<ArrayList<TreeNode>>();
/**
* 层次遍历
* @param root
* @return
*/
public ArrayList<ArrayList<Integer>> levelOrder (TreeNode root) {
if (root == null) {
return new ArrayList<ArrayList<Integer>>();
}
ArrayList<TreeNode> arrayList = new ArrayList<TreeNode>();
arrayList.add(root);
treeNodes.add(arrayList);
while (arrayList.size() > 0 ){
arrayList = getLevelTreeNode(arrayList);
}
ArrayList<ArrayList<Integer>> numList = new ArrayList<ArrayList<Integer>>();
for(int i = 0; i < treeNodes.size(); i++){
ArrayList<Integer> subList = new ArrayList<Integer>();
for(int j = 0; j< treeNodes.get(i).size();j++){
TreeNode node = treeNodes.get(i).get(j);
subList.add(node.val);
}
if(subList.size() > 0){
numList.add(subList);
}
}
return numList;
// write code here
}
public ArrayList<TreeNode> getLevelTreeNode(List<TreeNode> upLevelNodes){
ArrayList<TreeNode> list = new ArrayList<TreeNode>();
for(int i = 0; i < upLevelNodes.size(); i++){
TreeNode treeNode = upLevelNodes.get(i);
if(treeNode.left!= null){
list.add(treeNode.left);
}
if(treeNode.right!= null){
list.add(treeNode.right);
}
}
treeNodes.add(list);
return list;
}
}
5. 二叉树之字形打印
返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)
思路:按照第4题层次遍历后,对奇数行倒序即可
6. 二叉树最大深度(重要)
思路:递归
java
public int maxDepth(TreeNode root) {
if (root == null) {
return 0;
}
int leftDepth = maxDepth(root.left);
int rightDepth = maxDepth(root.right);
return leftDepth >= rightDepth ? leftDepth + 1 : rightDepth + 1;
}
7. 根节点到叶子节点的值和是sum, 判断有无
思路:递归
java
public boolean hasPathSum (TreeNode root, int sum) {
if(root == null){
return false;
}
// 注意整个结束条件的判断
if(sum == root.val && root.left == null && root.right == null){
return true;
}
Boolean leftHas = hasPathSum(root.left, sum-root.val);
Boolean rightHas = hasPathSum(root.right, sum-root.val);
if(leftHas || rightHas){
return true;
}
return false;
}
8. 中序遍历结果转成双向链表
思路:
-
中序遍历放到一个集合中
-
遍历集合元素,修改左右指针
9. 对称二叉树(重要)
思路1:
利用递归思想, 每个节点都比较它的左子树和有子树, 只不过,比较的是node.left = node.right
java
public class Solution {
boolean a = true;
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param pRoot TreeNode类
* @return bool布尔型
*/
public boolean isSymmetrical(TreeNode pRoot) {
if (pRoot == null) return a;
calSymmetrical(pRoot.left, pRoot.right);
return a;
}
void calSymmetrical(TreeNode b, TreeNode c) {
// 比较当前节点
if (b == null && c == null) {
return;
}
if (b != null && c == null || b == null && c != null) {
a = false;
return;
}
if (b.val != c.val) {
a = false;
return;
}
// 比较当前节点的子节点,只不过是b.left与c.right比较
calSymmetrical(b.left, c.right);
calSymmetrical(b.right, c.left);
return;
}
}
思路2:
-
层次遍历,如果节点的左节点或右节点null, 也放入到层级的集合中
-
判断这一层的集合元素是否都为空,都为空,将这层的集合置为空集合
-
遍历每一层的集合, 对一层集合元素左对称判断
缺点很明显,代码写起来太多了!
java
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* public TreeNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
private ArrayList<ArrayList<TreeNode>> treeNodes = new
ArrayList<ArrayList<TreeNode>>();
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param pRoot TreeNode类
* @return bool布尔型
*/
public boolean isSymmetrical (TreeNode pRoot) {
if (pRoot == null) {
return true;
}
ArrayList<TreeNode> arrayList = new ArrayList<TreeNode>();
arrayList.add(pRoot);
treeNodes.add(arrayList);
while (arrayList.size() > 0) {
arrayList = getLevelTreeNodeWithNUll(arrayList);
}
for (int i = 0; i < treeNodes.size(); i++) {
List<TreeNode> nodes = treeNodes.get(i);
for (int j = 0; j < nodes.size() / 2; j++) {
// 空节点的值记为-10000
int v1 = nodes.get(j) != null ? nodes.get(j).val : -10000;
int v2 = nodes.get(nodes.size() - j - 1 ) != null ? nodes.get(
nodes.size() - j - 1 ).val : -10000;
if (v1 != v2) {
return false;
}
}
}
return true;
}
/**
* 层次遍历, 如果是null节点也记录
*
* @param
* @return
*/
public ArrayList<TreeNode> getLevelTreeNodeWithNUll(List<TreeNode>
upLevelNodes) {
ArrayList<TreeNode> list = new ArrayList<TreeNode>();
Boolean res = upLevelNodes.isEmpty();
if (allNullNode(upLevelNodes)) {
return list;
}
for (int i = 0; i < upLevelNodes.size(); i++) {
TreeNode treeNode = upLevelNodes.get(i);
if (treeNode != null) {
list.add(treeNode.left);
list.add(treeNode.right);
} else {
list.add(null);
list.add(null);
}
}
if (!allNullNode(list)) {
treeNodes.add(list);
return list;
} else {
return new ArrayList<TreeNode>();
}
}
public Boolean allNullNode(List<TreeNode> list) {
for (TreeNode node : list) {
if (node != null) {
return false;
}
}
return true;
}
}