剑39—二叉树的深度
题目描述
输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
解题思路:
如果一棵树只有一个节点,则深度为1;
如果根节点只有左子树而没有右子树,则树的深度=左子树深度+1;
如果根节点只有右子树而没有左子树,则树的深度=右子树深度+1;
如果根节点既有左子树又有右子树,则树的深度=1+Math.max{左子树深度,右子树深度};
/**
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;
int left=TreeDepth(root.left);
int right=TreeDepth(root.right);
return (left>right)?(left+1):(right+1);
}
/*
//简单写法
public int TreeDepth(TreeNode root) {
if (root == null)
return 0;
return 1 + Math.max(TreeDepth(root.left), TreeDepth(root.right));
*/
}
剑40— 平衡二叉树
题目描述
输入一棵二叉树,判断该二叉树是否是平衡二叉树。
解题思路
平衡二叉树:左右子树深度相差不超过1
结合上述求二叉树深度问题,得到左右子树深度,相差不超过1,既满足。
常规容易想到解法(不太好)
结合上述求二叉树深度问题,得到左右子树深度,相差不超过1,既满足。
毫无疑问,会重复遍历同一个节点,影响性能。
public class Solution
{
//平衡二叉树:左右子树深度相差不超过1
//后序遍历方式,在遍历到一个节点之前,其左右子树已经遍历 依次自底向上判断,每个节点只需要遍历一次
//private boolean isBalanced=true;
public boolean IsBalanced_Solution(TreeNode root)
{
if(root==null)
return true;
int left=getDepth(root.left);
int right=getDepth(root.right);
int diff=left-right;
if(diff>1||diff<-1)
return false;
return IsBalanced_Solution(root.left)&&IsBalanced_Solution(root.right);
}
public int getDepth(TreeNode root) {
if(root==null)
return 0;
int left=getDepth(root.left);
int right=getDepth(root.right);
/*if(Math.abs(left-right)>1)
isBalanced=false;*/
return (left>right)?(left+1):(right+1);
}
}
每个节点只遍历依次的解法(推荐解法)
后序遍历方式,在遍历到一个节点之前,其左右子树已经遍历 依次自底向上判断,每个节点只需要遍历一次
public class Solution
{
private boolean isBalanced=true; //设置标志位
public boolean IsBalanced_Solution(TreeNode root)
{
getDepth(root);
return isBalanced;
}
public int getDepth(TreeNode root )//获取结点深度
{
if(root==null)
return 0;
int left=getDepth(root.left);
int right=getDepth(root.right);
if(Math.abs(left-right)>1)
isBalanced=false;//布尔值在这里改变,一边计算一边判断
return 1+(right>left?right:left);
}
}