二叉树的深度(平衡二叉树)

题目

  输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。

思路

  如果一棵树只有一个结点,它的深度为1,如果根节点只有左子树而没有右子树,那么树的深度应该是其左子树的深度+1.同样如果根节点只有右子树而没有左子树,那么树的深度应该是其右子树+1.如果既有左子树又有右子树,那概述的深度就是左、右子树的深度的较大值加1。

#include <iostream>
using namespace std;

struct tree
{
    double data;
    struct tree *left,*right;
    tree(int d=0):data(d)
    {
        left=right=nullptr;
    }
};
class Solution
{
    public:
        void create(tree *&root);
        int depth(tree *root);
        tree *root;
};
void Solution::create(tree *&root)
{
    double x;
    cin>>x;
    if(x==0)
        root=nullptr;
    else
    {
        root=new tree();
        root->data=x;
        create(root->left);
        create(root->right);
    }
}
int Solution::depth(tree *root)
{
    if(!root)
        return 0;

    int left=depth(root->left);
    int right=depth(root->right);

    return max(left,right)+1;
}
int main()
{
    Solution s;
    s.create(s.root);
    cout<<s.depth(s.root)<<endl;
    return 0;
}

题目

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

思路

  如果像去求二叉树的深度那样,先判断根节点是不是平衡的,在判断根的左右子树是不是平衡的,这样的话,会重复遍历很多节点(根的左右子树的子树),所以可以用后序遍历,遍历到根结点之前已经先遍历了左右子树,只需要在便利每个结点的时候记录它的深度,就可以一遍遍历一边判断每个节点是不是平衡的。

#include <iostream>
#include <cmath>
using namespace std;

struct tree
{
    double data;
    struct tree *left,*right;
    tree(int d=0):data(d)
    {
        left=right=nullptr;
    }
};
class Solution
{
    public:
        void create(tree *&root);
        int depth(tree *root);
        bool is_balance(tree *root);
        bool is_balance(tree *root,int &n);
        tree *root;
};
void Solution::create(tree *&root)
{
    double x;
    cin>>x;
    if(x==0)
        root=nullptr;
    else
    {
        root=new tree();
        root->data=x;
        create(root->left);
        create(root->right);
    }
}
bool Solution::is_balance(tree *root)
{
    if(!root)
        return false;
    int n=0;
    return is_balance(root,n);
}
bool Solution::is_balance(tree *root,int &n)
{
    if(!root)
    {
        n=0;
        return true;
    }
    int left=0,right=0;
    if(is_balance(root->left,left)&&is_balance(root->right,right))
    {
        int diff=left-right;
        if(abs(diff)<=1)
        {
            n=max(left,right)+1;
            return true;
        }
    }
    return false;
}
int main()
{
    Solution s;
    s.create(s.root);
    cout<<boolalpha<<s.is_balance(s.root)<<endl;
    return 0;
}

原文地址:https://www.cnblogs.com/tianzeng/p/10269261.html

时间: 2024-11-11 17:39:11

二叉树的深度(平衡二叉树)的相关文章

二叉树的深度相关问题

题目 输入一颗二叉树的根节点,求该树的深度.从根节点到叶节点依次经过的结点形成树的一条路径,最长路径的长度为树的深度. 思路 简化一下题目,思考一个节点的时候二叉树的深度为 1,因为左右子树都为0: 2个节点的时候二叉树深度为 2,左右子树的深度最大值加 1: 3个节点分两种情况: 4                   3 /  \                    \ 3   5                   4 \ 5 我们由这两种情况可以看出来,任意一颗二叉树的深度就是它的左右

剑指Offer--040-平衡二叉树(判断一棵二叉树是否是平衡二叉树)[扩展附加题]

链接 牛客OJ:平衡二叉树 九度OJ:未收录 GitHub代码: 040-平衡二叉树 CSDN题解:剑指Offer–040-平衡二叉树 牛客OJ 九度OJ CSDN题解 GitHub代码 040-平衡二叉树 未收录 剑指Offer–040-平衡二叉树 040-平衡二叉树 题意 题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树. 递归法 根据平衡二叉树的定义 平衡二叉树要求对于每一个节点来说,它的左右子树的高度之差不能超过1 因此我们递归的判断每一个根节点,判断左右子树的高度差 递归得到二叉

剑指Offer面试题39(Java版):二叉树的深度

题目:输入一棵二叉树的根节点,求该数的深度.从根节点到叶结点依次进过的结点(含根,叶结点)形成树的一条路径,最长路径的长度为树的深度. 例如,如下图的二叉树的深度为4,因为它从根节点到叶结点的最长的路径包含4个结点(从根结点1开始,经过2和结点5,最终到达叶结点7) 我们可以从另一种角度来理解树的深度.如果一棵树只有一个结点,它的深度为1,如果根节点只有左子树而没有右子树,那么树的深度应该是其左子树的深度+1.同样如果根节点只有右子树而没有左子树,那么树的深度应该是其右子树+1.如果既有左子树又

【3】输入一颗二叉树判断是不是平衡二叉树

题目:输入一颗二叉树的根结点,判断该二叉树是不是平衡二叉树.平衡二叉树是满足所有结点的左右子树的高度差不超过1的二叉树 方案一:遍历数组的每一个结点,对每一个结点求它的左右子树的高度并进行判断.时间复杂度大于O(n),小于O(n^2)效率较低,因为有很多点需要重复访问. //二叉树的结点 struct BinaryTreeNode{ int m_value; BinaryTreeNode *m_lson; BinaryTreeNode *m_rson; }; //求二叉树的深度 int GetD

N39_判断该二叉树是否是平衡二叉树。

题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树. package new_offer; /** * 输入一棵二叉树,判断该二叉树是否是平衡二叉树. * @author Sonya *思路: *1.借鉴上题 求树的深度.但是效率不高 需要重复遍历结点多次. *2.后续遍历,记录每个depth 只需要遍历一次. */ public class N39_IsBalanced_Solution { public boolean IsBalanced_Solution(TreeNode root)

剑指Offer对答如流系列 - 二叉树的深度

面试题55:二叉树的深度 题目描述 问题(1)二叉树的深度 输入一棵二叉树的根结点,求该树的深度.从根结点到叶结点依次经过的/结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 问题(2)平衡二叉树 输入一棵二叉树的根结点,判断该树是不是平衡二叉树.如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树. 问题分析 问题(1)分析 第一个问题对大家都小意思啦,树的深度=max(左子树深度,右子树深度)+1,采用递归实现. 问题(2)分析 同样需要计算树的深度,

二叉树的深度和宽度

// 求二叉树的深度和宽度.cpp : 定义控制台应用程序的入口点. #include "stdafx.h" #include <iostream> #include <queue> using namespace std; struct BTNode { char m_value; BTNode *m_left; BTNode *m_right; }; //先序创建二叉树 void CreatBTree(BTNode *&root) { char nV

二叉树各种相关操作(建立二叉树、前序、中序、后序、求二叉树的深度、查找二叉树节点,层次遍历二叉树等)(C语言版)

将二叉树相关的操作集中在一个实例里,有助于理解有关二叉树的相关操作: 1.定义树的结构体: 1 typedef struct TreeNode{ 2 int data; 3 struct TreeNode *left; 4 struct TreeNode *right; 5 }TreeNode; 2.创建根节点: 1 TreeNode *creatRoot(){ 2 TreeNode * root =(TreeNode *)malloc(sizeof(TreeNode)); 3 if(NULL=

二叉树系列 - 二叉树的深度,例 [LeetCode]

二叉树的深度的概念最值得注意的地方,在于 到"叶子"节点的距离. 一般来说,如果直接说“深度”,都是指最大深度,即最远叶子的距离. 这里放两道例题,最小深度和最大深度. 1. 二叉树的最小深度 Given a binary tree, find its minimum depth. The minimum depth is the number of nodes along the shortest path from the root node down to the nearest