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

首先如何求树的深度?


思想:

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);
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是判断二叉树是否为平衡二叉树的C++代码实现: ```c++ #include <iostream> #include <algorithm> using namespace std; // 定义二叉树节点 struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; // 判断是否平衡二叉树 bool isBalanced(TreeNode* root) { if (root == NULL) { return true; } // 计算左右子树的深度 int leftDepth = maxDepth(root->left); int rightDepth = maxDepth(root->right); // 判断左右子树的深度差是否大于1,如果大于1则不是平衡二叉树 if (abs(leftDepth - rightDepth) > 1) { return false; } // 递归判断左右子树是否都是平衡二叉树 return isBalanced(root->left) && isBalanced(root->right); } // 计算树的深度 int maxDepth(TreeNode* root) { if (root == NULL) { return 0; } int leftDepth = maxDepth(root->left); int rightDepth = maxDepth(root->right); return max(leftDepth, rightDepth) + 1; } int main() { TreeNode* root = new TreeNode(1); root->left = new TreeNode(2); root->right = new TreeNode(3); root->left->left = new TreeNode(4); root->left->right = new TreeNode(5); root->left->right->left = new TreeNode(6); if (isBalanced(root)) { cout << "This is a balanced binary tree." << endl; } else { cout << "This is not a balanced binary tree." << endl; } return 0; } ``` 算法思路: 1. 首先计算二叉树深度,可以使用递归的方式求解; 2. 然后分别计算左右子树的深度,判断其深度差是否大于1; 3. 如果深度差大于1,则不是平衡二叉树,直接返回false; 4. 如果深度差小于等于1,则需要继续递归判断左右子树是否都是平衡二叉树,如果都是平衡二叉树,则返回true,否则返回false。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值