26. 平衡二叉树

题目

输入一棵二叉树,判断该二叉树是否是平衡二叉树。

思路1

遍历每个结点,借助一个获取树深度的递归函数,根据该结点的左右子树高度差判断是否平衡,然后递归地对左右子树进行判断。时间复杂度O(n^2)

 public boolean isBalanced1(TreeNode root) { if (root == null) { return true; } if (Math.abs(MaxDepth(root.left) - MaxDepth(root.right)) > 1) return false; return isBalanced1(root.left) && isBalanced1(root.right); } public int MaxDepth(TreeNode root) { if (root == null) { return 0; } return 1 + Math.max(MaxDepth(root.left), MaxDepth(root.right)); } 

思路2

从下往上遍历,如果子树是平衡二叉树,则返回子树高度,否则返回-1。时间复杂度O(n),一旦有某个子树不平衡了会返回-1,则会一直递归向上返回-1,减少了重复的递归计算。

public boolean isBalanced2 (TreeNode root) { return balancedHeight (root) >= 0; } /* * Returns the height of `root` if `root` is a balanced tree, * otherwise, returns `-1`. */ private static int balancedHeight (TreeNode root) { if (root == null) return 0; // 终止条件 int left = balancedHeight (root.left); int right = balancedHeight (root.right); //一旦有某个子树不平衡了,会返回-1,则会一直递归向上全都返回-1,所以root也返回-1 if (left < 0 || right < 0 || Math.abs(left - right) > 1) return -1; // 剪枝 //返回-1后这里不会再执行到 return Math.max(left, right) + 1; // 三方合并 } 
    原文作者:平衡二叉树
    原文地址: https://blog.csdn.net/DjokerMax/article/details/82973418
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞