求树的深度和判断是否为平衡二叉树

首先如何求树的深度?

思想:

1.求树的深度首先要判断这棵树是否为空树,如果为空树就返回0。
2.定义俩个变量来记录左子树与右子树的大小。
3.比较左子树与右子树的大小,返回大的值 加一。
4.以上为递归遍历,约束条件为左子树或右子树是否为零。

实现代码:

int TreeDepth(BTnode* TreeNode)
{
    if(TreeNode==NULL)
        return 0;
    int left=TreeDepth(TreeNode->left);
    int right=TreeDepth(TreeNode->right);

    return left>right?(left+1):(right+1);
}

如何判断是否为平衡二叉树:

什么是平衡树
平衡二叉树就是它是一颗空树或者它的左右子树的高度差不超过一并且它的左右子树也是平衡树。

思想:

1.如果它是一颗空树,则返回true。
2.计算它的左子树的深度与右子树的深度,进行相减若相减结果绝对值大于1则返回false,不是平衡而二叉树。
3.执行到这一步则return这个函数这个节点的左节点与右节点技能递归。

实现代码O(n²) :

bool IsBalanTree(BTnode* pRoot) {

        if(pRoot==NULL)
            return true;
        int left=depth(pRoot->left);
        int right=depth(pRoot->right);
        if(left-right>1||left-right<-1)
            return false;
        return IsBalanTree(pRoot->left)&&IsBalanTree(pRoot->right);
    }

上述方法时间复杂度太大,每一判断都要遍历一遍二叉树,多了很多不必要的遍历步骤,下面这种方法只遍历一次就可,执行一个节点判断一次是否为平衡为平衡二叉树。
我们可以采用后续遍历的方法遍历每个节点来搞定它,在遍历一个节点之前我们已经遍历了它的左右子树,只有在遍历每个节点时记录它的深度,我们就可以边遍历边判断啦。

代码实现O(n) :


public class Solution {
    public boolean IsBalanced_Solution(TreeNode root) {
        return getDepth(root) != -1;
    }

    private int getDepth(TreeNode root) {
        if (root == null) return 0;
        int left = getDepth(root.left);
        if (left == -1) return -1;
        int right = getDepth(root.right);
        if (right == -1) return -1;
        return Math.abs(left - right) > 1 ? -1 : 1 + Math.max(left, right);
    }
}
    原文作者:平衡二叉树
    原文地址: https://blog.csdn.net/zhaoxaun666/article/details/80820862
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞