/*** 求二叉樹的深度* @author liaojiamin* @Date:Created in 17:43 2021/6/24*/publicclassBinaryDepth{publicstaticvoidmain(String[] args){BinaryNode node1 =newBinaryNode(null, null, null);BinarySearchTree tree1 =newBinarySearchTree();Random random =newRandom();int[] array =newint[]{1,27,37,19,514,216,118,320,426,228};for(int i =0; i < array.length; i++){node1 = tree1.insert(Integer.valueOf(random.nextInt(20)), node1);}System.out.println(validateBalancedTree(node1));tree1.printTree(node1);}/*** 一棵二叉樹中所有節(jié)點(diǎn)對(duì)應(yīng)的左右子樹高度差不超過1 ,那么說明這棵樹是平衡二叉樹* 遞歸判斷是否平衡樹* */publicstaticbooleanvalidateBalancedTree(BinaryNode tree){if(tree == null){returntrue;}int left =depthBinary(tree.getLeft());int right =depthBinary(tree.getRight());int diff = Math.abs(left - right);if(diff >1){returnfalse;}returnvalidateBalancedTree(tree.getLeft())&&validateBalancedTree(tree.getRight());}/*** 遞歸方式求解,* 左節(jié)點(diǎn)為空則,左高度為left = 0,總高度為 left + 1* 右節(jié)點(diǎn)為空則,右高度為right = 0,總高度為 right + 1* 遞歸到子節(jié)點(diǎn),賦值left= 0,right = 0,接著一層一層遞歸上到根節(jié)點(diǎn)。* */publicstatic Integer depthBinary(BinaryNode tree){if(tree == null){return0;}int left =depthBinary(tree.getLeft());int right =depthBinary(tree.getRight());return left > right ? left +1: right +1;}}
以上代碼比較簡單,但是存在問題是節(jié)點(diǎn)會(huì)被重復(fù)遍歷,當(dāng)遍歷第二層節(jié)點(diǎn) B,C時(shí)候,會(huì)遍歷H I J節(jié)點(diǎn),同樣 遍歷D,E F G時(shí)候還是會(huì)重復(fù)遍歷H I J 節(jié)點(diǎn),類似斐波那契數(shù)量的遞歸求解一樣,重復(fù)的遍歷會(huì)時(shí)間復(fù)雜度指數(shù)級(jí)增長,當(dāng)樹高度越大,重復(fù)遍歷的次數(shù)越多。我們需要找到更優(yōu)方案