求解二叉树的深度(高度)_C语言

这是在阿里面试的一道题,刚难道感觉不是很难。于是按查找最大值和最小值的方法计算二叉树的深度。结果发现这俩个根本不是一回事。即使你不断遍历左子树,找到了最小

值,但是其最小值节点依然可能会有右子树,这样深度也就会不断增加。也就是说最大值对应的节点并不等同于右子树的深度,最小值对应的节点并不等同于左子树的深度。

面试结果也就可想而知了。

其实拿到这道题,首先想到的应该是采用递归算法。递归算法就得明确两点:

1、基准情形:空树返回-1;

2、递归形式:若不是空树,比较它的左子树深度和右子树深度,返回较大深度值加1,即:return (rightdep>leftdep) ? rightdep+1 : leftdep+1;

编程示例如下:

#include<stdio.h>
#include<stdlib.h>
#define N 10

typedef struct BinTreeNode
{
    int data;
    struct BinTreeNode *left;
    struct BinTreeNode *right;
}BinTreeNode,*BinTree;

BinTree insert(BinTree T,int data);//二叉树节点的添加
int TreeDepth(BinTree T);//返回树的深度(高度)

int main()
{
    int i=0;
    int data[N]= {20, 15 ,10, 12, 18, 25, 30,16,17,18};
    BinTreeNode *root=NULL;
    int Depth=0;

    for(i=0;i<N;i++)
    {
        root=insert(root,data[i]);
    }

    Depth=TreeDepth(root);
    printf("\nTree Depth is %d.\n",Depth);
    free(root);
    return 0;
}
//注意理解递归
int TreeDepth(BinTree T)
{
     int rightdep=0;
     int leftdep=0;

    if(T==NULL)
        return -1;

    if(T->left!=NULL)
        leftdep=TreeDepth(T->left);
    else
        leftdep=-1;

    if(T->right!=NULL)
        rightdep=TreeDepth(T->right);
    else
        rightdep=-1;

    return (rightdep>leftdep) ? rightdep+1 : leftdep+1;
}

BinTree insert(BinTree T,int data)
{
    if(T==NULL)
    {
        T=malloc(sizeof(BinTreeNode));
        if(T==NULL)
            printf("Out of space!\n");
        else
        {
            T->data=data;
            T->left=NULL;
            T->right=NULL;
        }
    }
    else
    {
        if(data<T->data)
            T->left=insert(T->left,data);
        else
            T->right=insert(T->right,data);
    }
    return T;
}
时间: 2024-09-28 16:02:16

求解二叉树的深度(高度)_C语言的相关文章

从&quot;按层次输出二叉树&quot;到&quot;求解二叉树深度&quot;的总结

本文是在学习中的总结,欢迎转载但请注明出处:http://write.blog.csdn.net/postedit/41964669 最近在刷LettCode上的算法题,发现好多题目的解题思路大体是一致的,甚至会出现一解对多题的情形,可能一方面原因是我刷的都是简单题,另一方面原因可能是网站有意来提高我们的信心和联想能力.比如有求解二叉树最大深度和求解二叉树最小深度的题目,也有判断两颗树是否完全一致和判断两个树是否轴对称的题目,还有按层次从树根往下输出每层元素和按层次从下往树根输出每层元素的题目等

递归求解二叉树任意一结点的深度

这个事最后一道大题的第一小题 让写个递归算法求解二叉树任意一结点的深度 首先应该去递归找到这个x结点,找到后然后再递归求解以x为根结点的子树的深度,所以我就很规矩(当然我觉得这样写比较明了)写了两个递归函数 当然首先还是得建立二叉排序树 另外注明:是用vs2010写的,没有在vc++6.0上面测试,如果朋友们发现在vc++上有bug,欢迎指出,供后来者看看 贴下自己的代码 //功能:递归算法,求二叉树中以元素值为x的结点为根的子树的深度 //时间:2014-11-23 #include <ios

二叉树各种相关操作(建立二叉树、前序、中序、后序、求二叉树的深度、查找二叉树节点,层次遍历二叉树等)(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=

[华为机试练习题]42.求二叉树的深度和宽度

题目 题目标题: 求二叉树的宽度和深度 给定一个二叉树,获取该二叉树的宽度和深度. 例如输入 a / b c / \ / d e f g 返回3. 接口说明 原型: int GetBiNodeInfo(BiNode &head, unsigned int *pulWidth, unsigned int *pulHeight) 输入参数: head 需要获取深度的二叉树头结点 输出参数(指针指向的内存区域保证有效): pulWidth 宽度 pulHeight 高度 返回值: 0 成功 1 失败或

求二叉树的深度 python

题目描述 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度.解题思路 两种解法,一种是第一时间的思路,即获得根节点到每个叶节点的深度,取其中最长的返回: class Solution:    def __init__(self):        self.maxDeep = 0        self.curDeep = 0 def TreeDepth(self, pRoot):        if not pRoot:   

二叉树的深度和宽度

// 求二叉树的深度和宽度.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

二叉树系列 - 二叉树的深度,例 [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

编程算法 - 二叉树的深度 代码(C)

二叉树的深度 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入一棵二叉树的根节点, 求该树的深度. 依次选择最深的左右子树, 然后递归加1. 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <stdio.h> #include <stdlib.h> #include <

黑马程序员_C语言总结-基础部分

C语言基础 1.C语言的关键字 1>关键字就是C语言提供的有特殊含义的符号,也称为保留字,C语言中一共有32个关键字,这些关键字都有自己的含义 例如:int double float if  else switch for 等等 2.标示符的概念: 1>标示符就是在程序中自定义的一些名称,比如函数名,变量名,结构体名等等这些都是标示符 2>命名规则: 1>只能由英文字母的大小写和数字以及_下划线组成,且首字母必须为字母或者下划线_ 2>在C语言中是严格区分大小写的,比如if是