平衡二叉树
题目链接
平衡二叉树:
平衡二叉树也叫AVL树,它或者是一颗空树,或者具有以下性质的二叉排序树:它的左子树和左子树的高度之差(平衡因子)的绝对值不超过1,且它的左子树和右子树都是一颗平衡二叉树。
思路:计算高度确认前序遍历,首先判断左子树是否是平衡二叉树,然后判断右子树是否是平很二叉树,若不是直接按返回,最后判断是否为平衡二叉树。
代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {//求高度用后序遍历,求深度用前序遍历
public int getHeight(TreeNode root){
if(root==null){//终止条件
return 0;
}
int leftHeight=getHeight(root.left);
if(leftHeight==-1){//如果左子树不是平衡二叉树,那么直接说明整棵树不是平衡二叉树
return -1;
}
int rightHeight=getHeight(root.right);//同上
if(rightHeight==-1){
return -1;
}
int res=0;
//判断子树是否为平衡二叉树
//平衡二叉树 是指该树所有节点的左右子树的深度相差不超过 1。
if( Math.abs(leftHeight-rightHeight)>1){
res= -1;
}else{
res=1+Math.max(leftHeight,rightHeight);
}
return res;
}
public boolean isBalanced(TreeNode root) {
int res = getHeight(root);
if (res == -1) {
return false;
} else {
return true;
}
}
}
二叉树的所有路径
题目链接
思路:题目要求根节点到叶子节点所有的不同路径,明显为前序遍历,依旧是使用递归写法
代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public void f(TreeNode root, LinkedList<Integer> list, LinkedList<String> result) {
list.add(root.val);
if (root.left == null && root.right == null) {// 终止条件,遇到叶子节点
String ans = "";
for (int i = 0; i < list.size() - 1; i++) {
ans += list.get(i) + "->";
}
ans += list.get(list.size() - 1);
result.add(ans);
}
if (root.left != null) {
f(root.left, list, result);
list.removeLast();// 回溯
}
if (root.right != null) {
f(root.right, list, result);
list.removeLast();// 回溯
}
}
public List<String> binaryTreePaths(TreeNode root) {
LinkedList<Integer> list = new LinkedList<>();
LinkedList<String> result = new LinkedList<>();
f(root, list, result);
return result;
}
}
左叶子之和
题目链接
明确左叶子的定义:A节点的左孩子非空,并且左孩子的左右节点都为空(叶子节点)
代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public void f(TreeNode root, LinkedList<Integer> list){
if(root==null){
return;
}
/*
因为题目中其实没有说清楚左叶子究竟是什么节点,那么我来给出左叶子的明确定义:节点A的左孩子不为空,且左孩子的左右孩子都为空(说明是叶子节点),那么A节点的左孩子为左叶子节点
*/
if(root.left!=null&&root.left.left==null&&root.left.right==null){
list.add(root.left.val);
}
f(root.left,list);//将左子树的左叶子加入list
f(root.right,list);//将右子树的左叶子加入list
}
public int sumOfLeftLeaves(TreeNode root) {
LinkedList<Integer> list = new LinkedList<>();
f(root,list);
int sum=0;
for (int i = 0; i <list.size() ; i++) {
sum+=list.get(i);
}
return sum;
}
}