二叉树之下

2. 求二叉树的高度

2017-03-14  本文已影响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

上一篇下一篇

猜你喜欢

热点阅读