软件工程师面试题精选100题(60)-判断二叉树是不是平衡的
程序员面试题精选100题(60)-判断二叉树是不是平衡的
题目:输入一棵二叉树的根结点,判断该树是不是平衡二叉树。如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。
我们用后序遍历的方式遍历二叉树的每一个结点,在遍历到一个结点之前我们已经遍历了它的左右子树。只要在遍历每个结点的时候记录它的深度(某一结点的深度等于它到叶节点的路径的长度),我们就可以一边遍历一边判断每个结点是不是平衡的
题目:输入一棵二叉树的根结点,判断该树是不是平衡二叉树。如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。
int getHeight(Node node){ if(node==null){ return 0; } int heigth = 1; if(node.left!=null){ height = 1+getHeight(node.left); } if(node.rigth!=null){ int h = 1+getHeight(node.right); height = height>h?height:h; } return height; } boolean isBalance(Node node){ if(node==null){ return true; } int left = getHeight(node.left); int right = getHeight(node.right); int diff = left - right; if(diff > 1 || diff < -1) return false; return isBalance(node.left)&&isBalance(node.right); }
我们用后序遍历的方式遍历二叉树的每一个结点,在遍历到一个结点之前我们已经遍历了它的左右子树。只要在遍历每个结点的时候记录它的深度(某一结点的深度等于它到叶节点的路径的长度),我们就可以一边遍历一边判断每个结点是不是平衡的
boolean isBalance(Node node,Depth d){ if(node==null){ d.height=0; return true; } Depth right=new Depth(); depth left = new Depth(); if(isBalance(node.left,left)&&isBalance(node.right,right)){ int diff = left.height-right.height; if(diff<=1||diff>=-1){//绝对值小于等于1 //如果是平衡树,才有必要算深度,然后看上级是不是平衡树 d.height=left.height>right.height?left.height:right.height; return true } } return false; }