首页 > 其他分享 >非递归求树高

非递归求树高

时间:2023-08-16 11:03:59浏览次数:24  
标签:return 递归 int Queue NULL preNode curNode 求树高

利用层次遍历求树高,最重要的就是计算每一层的遍历什么时候结束。

curNode: 入队+1,出队-1。时刻记录队列中结点个数,preNode==0时,curNode==下一层结点个数

preNode:出队-1,当==0时,该层遍历结束。preNode=curNode;high++;

//非递归求二叉树的高度或深度
int TreeHighByQueue(Tree T)
{
    if(T==NULL)
        return 0; 
    Queue Q;      
    InitQueue(Q);
    TreeNode* p=T;
    int high=0;
    EnQueue(Q,p);    //根节点入队,第一层只有一个 
    int preNode=1;     
    int curNode=1;
    while(!isEmpty(Q))
    {
        DeQueue(Q,p);
        preNode--;
        curNode--;
        if(p->lchild!=NULL)
        {
            EnQueue(Q,p->lchild);
            curNode++;
        }
        if(p->rchild!=NULL)
        {
            EnQueue(Q,p->rchild);
            curNode++;
        }
        if(preNode==0)
        {
            preNode=curNode;
            high++;
        }
    }
    return high;
}

 

完整代码:

#include <stdio.h>
#include <stdlib.h>

#define MaxSize 100

typedef struct Node{
    int data;
    struct Node *lchild,*rchild;
}TreeNode,*Tree;

typedef struct {
    TreeNode* data[MaxSize];
    int front,rear;
}Queue;

void InitQueue(Queue &Q)
{
    Q.front=Q.rear=0;
}

bool isEmpty(Queue Q)
{
    if(Q.front==Q.rear)
        return true;
    return false;
}

bool isFull(Queue Q)
{
    if((Q.rear+1)%MaxSize==Q.front)
        return true;
    return false; 
}

bool EnQueue(Queue &Q,TreeNode* p)
{
    if(isFull(Q))
        return false;
    Q.data[Q.rear]=p;
    Q.rear=(Q.rear+1)%MaxSize;
    return true;
}

bool DeQueue(Queue &Q,TreeNode* &p)
{
    if(isEmpty(Q))
        return false;
    p=Q.data[Q.front];
    Q.front=(Q.front+1)%MaxSize;
    return true;
}

void CreateTree(Tree &T)
{
    int x;
    scanf("%d",&x);
    if(x==-1)
    {
        T=NULL;
        return;
    }
    else
    {
        T=(Tree)malloc(sizeof(TreeNode));
        T->data=x;
        printf("输入%d的左结点:",x);
        CreateTree(T->lchild);
        printf("输入%d的右结点:",x);
        CreateTree(T->rchild);
    }
}

//递归求二叉树的高度或深度 
int TreeHigh(Tree T)
{
    int High=0;
    if(T!=NULL)
    {
        int lefthigh=TreeHigh(T->lchild);
        int righthigh=TreeHigh(T->rchild);
        High=lefthigh>righthigh?lefthigh+1:righthigh+1;
    }
    return High;
}

//非递归求二叉树的高度或深度
int TreeHighByQueue(Tree T)
{
    if(T==NULL)
        return 0;
        
    Queue Q;
    InitQueue(Q);
    TreeNode* p=T;
    int high=0;
    EnQueue(Q,p);    //根节点入队,第一层只有一个 
    int preNode=1;     
    int curNode=1;
    while(!isEmpty(Q))
    {
        DeQueue(Q,p);
        preNode--;
        curNode--;
        if(p->lchild!=NULL)
        {
            EnQueue(Q,p->lchild);
            curNode++;
        }
        if(p->rchild!=NULL)
        {
            EnQueue(Q,p->rchild);
            curNode++;
        }
        if(preNode==0)
        {
            preNode=curNode;
            high++;
        }
    }
    return high;
}

int main()
{
    Tree T;
    CreateTree(T);
    int High=TreeHigh(T);
    printf("树高%d",High);
    return 0;
} 

 

标签:return,递归,int,Queue,NULL,preNode,curNode,求树高
From: https://www.cnblogs.com/simpleset/p/17633411.html

相关文章

  • Go 语言递归函数
    递归,就是在运行的过程中调用自己。阶乘packagemainimport"fmt"funcFactorial(xint)(resultint){ifx==0{result=1}else{result=x*Factorial(x-1)}return}funcmain(){variint=15fmt.Printf("%d的阶乘是%d\n",i......
  • 第12周项目3-用递归方法求解(6)
    问题及代码:/**Copyright(c)2014,烟台大学计算机学院*Allrightsreserved.*文件名称:MADE49.cpp*作者:孙化龙*完成日期:2014年11月18日*版本号:v1.0**问题描述:汉诺塔*输入描述:无*输出描述:汉诺塔的移动*/#include<iostream>usingnamespacestd;vo......
  • 第12周项目3-用递归方法求解(5)
    问题及代码:/**Copyright(c)2014,烟台大学计算机学院*Allrightsreserved.*文件名称:MADE48.cpp*作者:孙化龙*完成日期:2014年11月18日*版本号:v1.0**问题描述:输入一个整数n,输出对应的二进制形式,用递归函数实现*输入描述:一个整数n*输出描述:对应的二进制形......
  • 第12周项目3-用递归方法求解(3)
    问题及代码:/**Copyright(c)2014,烟台大学计算机学院*Allrightsreserved.*文件名称:MADE47.cpp*作者:孙化龙*完成日期:2014年11月6日*版本号:v1.0**问题描述:求2数的最大公约数*输入描述:2个整数*输出描述:2数的最大公约数*/#include<iostream>usingn......
  • 第12周项目3-用递归方法求解(2)
    问题及代码:/**Copyright(c)2014,烟台大学计算机学院*Allrightsreserved.*文件名称:MADE46.cpp*作者:孙化龙*完成日期:2014年11月6日*版本号:v1.0**问题描述:求从1开始连续奇数的乘积*输入描述:最大奇数*输出描述:积值*/#include<iostream>usingnames......
  • 二叉树的非递归遍历
    //非递归操作#include<stdio.h>#include<stdlib.h>#defineMaxSize200typedefstructTreeNode{intdata;structTreeNode*lchild,*rchild;}TreeNode,*Tree;typedefstruct{Treedata[MaxSize];inttop;}Stack;voidInitStack(S......
  • 二叉树的递归遍历
    #include<stdio.h>#include<stdlib.h>typedefstructTNode{intdata;structTNode*lchild,*rchild;}TreeNode,*Tree;/*在这段代码中,递归函数`CreateTree`在执行`return`语句后,会立即返回到调用它的上一层递归调用。但是,整个递归过程并没有结束,仍然会......
  • 利用C语言递归函数解决求5的方法是什么
    利用C语言递归函数解决求5的方法是什么在C语言编程中,递归是一种非常有用的技术,它能够简化问题的解决过程并提高代码的复用性。本文将以求解数字5为例,介绍如何利用C语言递归函数来实现这一任务。9利用C语言递归函数解决求5的方法是什么首先,让我们明确问题的定义。求解数字5的方......
  • 数据结构与算法 --- 递归(二)
    引言上文数据结构与算法---递归(一)讲述了什么是递归算法,如何编写递归算法及如何写好递归算法,本文着重讲述一下如何避免递归过深导致的堆栈溢出问题。探究产生堆栈溢出的原因函数调用采用函数调用栈来保存当前“快照”(局部变量,返回地址等)。函数调用栈是内存中开辟的一块存储空......
  • 数据结构与算法 --- 递归(一)
    什么是递归?递归(Recursion)是一种解决问题的方法,它将问题分解为更小的子问题,并逐层解决这些子问题。递归算法的核心思想是:一个函数可以直接或间接地调用自身。通过这种自我调用,我们可以用简洁的代码来解决复杂问题。满足递归的条件一般来说,满足下面三个条件就可以使用递归:待......