美文网首页二叉树之下
2. 求二叉树的高度

2. 求二叉树的高度

作者: 时光杂货店 | 来源:发表于2017-03-14 17:49 被阅读105次

题目

定义一个方法,实现输入一棵二叉树,输出这棵二叉树的高度。

解题之法

//求树的高度
//法1:后序遍历,结点最大栈长即为树的高度
//法2:层次遍历,层次即为高度
//法3:递归求树高
//输入:-+a##*b##-c##d##/e##f##
//输出:5

#include<iostream>
#include<stack>
#include<queue>
using namespace std;
typedef struct BiTNode{
    char data;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

void CreateTree(BiTree &T)
{
    char ch;
    cin>>ch;
    if(ch=='#') T=NULL;
    else
    {
        T=(BiTree)malloc(sizeof(BiTNode));
        if(!T)  cout<<"生成结点错误!"<<endl;
        T->data=ch;
        CreateTree(T->lchild);
        CreateTree(T->rchild);
    }
}

//法1:后序遍历,结点最大栈长即为树的高度
int BT_high(BiTree T)
{
    BiTree p=T,r=NULL;
    int max=0;                                     //树高
    stack<BiTree> s;
    while(p||!s.empty())
    {
        if(p!=NULL)
        {
            s.push(p);
            p=p->lchild;
        }
        else
        {
            p=s.top();
            if(p->rchild!=NULL && p->rchild!=r)
                p=p->rchild;
            else
            {
                if(s.size()>max)    max=s.size();//最大层次即为高度
                r=p;
                s.pop();
                p=NULL;
            }
        }
    }
    return max;
}

//法2:层次遍历,层次即为高度
int BT_level_depth(BiTree T)
{
    if(!T)  return 0;
    BiTree p=T,Q[100];
    int front=-1,rear=-1,last=0,level=0;
    Q[++rear]=p;
    while(front<rear)
    {
        p=Q[++front];
        if(p->lchild)
            Q[++rear]=p->lchild;
        if(p->rchild)
            Q[++rear]=p->rchild;
        if(front==last)
        {
            last=rear;
            level++;               //层次+1
        }
    }
    return level;
}

//法3:递归求树高1
int max1=0;//树高
int BT_depth1(BiTree T,int depth)
{
    if(T)
    {
        if(T->lchild)
            BT_depth1(T->lchild,depth+1);
        if(T->rchild)
            BT_depth1(T->rchild,depth+1);
    }
    if(depth>max1)  
        max1=depth;
    return depth;
}
 
//法3:递归求树高2
int Height (BiTree T)
{  
    if(T==NULL) return 0;
    else 
    {
        int m = Height ( T->lchild );
        int n = Height(T->rchild);
        return (m > n) ? (m+1) : (n+1); 
    }
}

int main()
{
    BiTree T=NULL;
    CreateTree(T);
    cout<<"后序遍历求树高:"<<endl;
    cout<<BT_high(T)<<endl;
    cout<<"层次遍历求树高:"<<endl;
    cout<<BT_level_depth(T)<<endl;
    cout<<"递归求树高1:"<<endl;
    BT_depth1(T,1);
    cout<<max1<<endl;
    cout<<"递归求树高2:"<<endl;
    cout<<Height(T)<<endl;
    return 0;
}

本篇博客内容转载自[《求二叉树的高度(后序遍历、层次遍历、递归算法)》][0]
[0]: http://aleeee.com/bt_high.html

相关文章

  • 二叉树遍历应用

    【例】输出二叉树中的叶子节点 【例】求二叉树高度

  • 2. 求二叉树的高度

    题目 定义一个方法,实现输入一棵二叉树,输出这棵二叉树的高度。 解题之法 本篇博客内容转载自[《求二叉树的高度(后...

  • 编程问题,求大神解答

    以二叉链表作存储结构,试编写求二叉树高度的程序

  • 递归求二叉树某一层的所有节点及求二叉树的高度

    1、输出二叉树某一层上所有的节点,一般用递归方式解决。2、求二叉树的高度,也用递归方式解决。 //求最大值 //创...

  • 二叉树高频面试题和答案

    先上二叉树的数据结构: 二叉树的题目普遍可以用递归和迭代的方式来解 1. 求二叉树的最大深度 2. 求二叉树的最小...

  • 二叉树算法题集合(java实现)

    先上二叉树的数据结构: 二叉树的题目普遍可以用递归和迭代的方式来解。 1.求二叉树的最大深度 2.求二叉树的最小深...

  • 判断一个树是否是BST 求一棵平衡二叉树的最小深度 判断一棵二叉树是否高度平衡

  • 二叉树 - 最大距离

    参考二叉树的最大距离 求二叉树的深度代码很简洁,如下: 我们要求的二叉树的最大距离,肯定是某个节点左子树的高度加上...

  • 二叉树的层次遍历

    前言 对于二叉树来说,层次遍历可以说是很平常的,但由于其应用广泛,比如可以用来求二叉树的高度和宽度,因而非常重要。...

  • 2008数据结构A

    一、 1. 高度为k,且有_____个结点的二叉树称为_____二叉树。 【答案】2k-1,满 2. 线性表的顺...

网友评论

    本文标题:2. 求二叉树的高度

    本文链接:https://www.haomeiwen.com/subject/zmwhnttx.html