目录
题目一
题目描述
二叉树的深度
输入一颗二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。
二叉树的节点定义如下:
测试用例
- 功能测试(输入普通的二叉树;二叉树中所有节点都没有左/右子树)
- 特殊输入测试(二叉树只有一个节点;二叉树的头节点为空指针)
解题思路
递归思路
一个树的深度可以理解为左、右子树深度的最大值加1。
参考解题
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
// 递归
public int TreeDepth(TreeNode root) {
// 异常
if(root == null){
return 0;
}
return Math.max(TreeDepth(root.left), TreeDepth(root.right)) + 1;
}
}
题目二
平衡二叉树
输入一颗二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树任意节点的左、右子树的深度相差不超过1,那么它就是一颗平衡二叉树。
测试用例
- 功能测试(输入普通的二叉树;不是平衡的二叉树;二叉树中所有节点都没有左/右子树)
- 特殊输入测试(二叉树只有一个节点;二叉树的头节点为空指针)
解题思路
利用树的深度来判断
参考解题思想是树的后序遍历(从下到上)。在每个节点记录它的深度,如果不平衡,则记录该节点的深度为-1。
参考解题
public class Solution {
// 后序遍历,从下往上判断是否为平衡二叉树,-1表示不是AVL
public boolean IsBalanced_Solution(TreeNode root) {
// 异常
if(root == null){
return true;
}
return getH(root)!=-1;
}
// 后序遍历获取高度差,-1表示高度差超过1,不是平衡二叉树
private int getH(TreeNode root){
// 异常
if(root == null){
return 0;
}
int nLeft = getH(root.left);
if(nLeft == -1){
return -1;
}
int nRight = getH(root.right);
if(nRight == -1){
return -1;
}
if(Math.abs(nLeft - nRight) > 1){
return -1;
}
return Math.max(nLeft, nRight) + 1;
}
}
后序遍历
//后序遍历序列
public List<Integer> postorderTraversal(TreeNode root){
if(root == null ){
return null;
}
List<Integer> result = new ArrayList();
return post(root, result);
}
List<Integer> post(TreeNode root, List<Integer> result){
if(root == null ){
return null;
}
post(root.left, result);
post(root.right, result);
result.add(root.val);
return result;
}