题目一:输入一棵二叉树的根结点,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
代码实现:
public class BinaryTreeNode{ int value; BinaryTreeNode left; BinaryTreeNode right; public BinaryTreeNode(int data,BinaryTreeNode node1,BinaryTreeNode node2){ this.value=data; this.left=node1; this.right=node2; } }
public class Solution{ public static int treeDepth(BinaryTreeNode node){ if(node==null){ return 0; } int left=treeDepth(node.left); int right=treeDepth(node.right); return left>right?(left+1):(right+1); } public static void main(String[] args){ BinaryTreeNode node7=new BinaryTreeNode(7,null,null); BinaryTreeNode node6=new BinaryTreeNode(6,null,null); BinaryTreeNode node5=new BinaryTreeNode(5,node7,null); BinaryTreeNode node4=new BinaryTreeNode(4,null,null); BinaryTreeNode node3=new BinaryTreeNode(3,null,node6); BinaryTreeNode node2=new BinaryTreeNode(2,node4,node5); BinaryTreeNode node1=new BinaryTreeNode(1,node2,node3); int depth=treeDepth(node1); System.out.println(depth); } }
题目二:输入一棵二叉树的根结点,判断该树是不是平衡二叉树,如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。
方法一:
public class Solution{ public static boolean isBalanced(BinaryTreeNode node){ if(node==null){ return true; } int left=treeDepth(node.left); int right=treeDepth(node.right); int diff=left-right; if(diff>1||diff<-1){ return false; } return isBalanced(node.left)&&isBalanced(node.right); } public static int treeDepth(BinaryTreeNode node){ if(node==null){ return 0; } int left=treeDepth(node.left); int right=treeDepth(node.right); return left>right?(left+1):(right+1); } public static void main(String[] args){ BinaryTreeNode node7=new BinaryTreeNode(7,null,null); BinaryTreeNode node6=new BinaryTreeNode(6,null,null); BinaryTreeNode node5=new BinaryTreeNode(5,node7,null); BinaryTreeNode node4=new BinaryTreeNode(4,null,null); BinaryTreeNode node3=new BinaryTreeNode(3,null,node6); BinaryTreeNode node2=new BinaryTreeNode(2,node4,node5); BinaryTreeNode node1=new BinaryTreeNode(1,node2,node3); System.out.println(isBalanced(node1)); } }
方法二(高效):
后序遍历二叉树,只需要遍历一遍。
public class Solution{ public static boolean isBalanced(BinaryTreeNode node){ return getDepth(node)!=-1; } public static int getDepth(BinaryTreeNode node){ if(node==null){ return 0; } int left=getDepth(node.left); if(left==-1){ return -1; } int right=getDepth(node.right); if(right==-1){ return -1; } return Math.abs(left-right)>1?-1:Math.max(left,right)+1; } public static void main(String[] args){ BinaryTreeNode node7=new BinaryTreeNode(7,null,null); BinaryTreeNode node6=new BinaryTreeNode(6,null,null); BinaryTreeNode node5=new BinaryTreeNode(5,node7,null); BinaryTreeNode node4=new BinaryTreeNode(4,null,null); BinaryTreeNode node3=new BinaryTreeNode(3,null,node6); BinaryTreeNode node2=new BinaryTreeNode(2,node4,node5); BinaryTreeNode node1=new BinaryTreeNode(1,node2,node3); System.out.println(isBalanced(node1)); } }