二叉树求其高度以及宽度

题目

二叉树采用链表存储
1、计算二叉树的高度
2、计算二叉树的最大宽度(二叉树最大宽度指的是二叉树所有层中结点个数最大的值)

代码


#include <iostream>
using namespace std;
#define MAXSIZE 50
typedef char ElemType;

//定义二叉树
typedef struct BiTNode{
    ElemType data;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//定义队列
typedef struct SqQueue{
    struct BiTNode *data[MAXSIZE];
    int front,rear;
}SqQueue;
//初始化队列
void InitQueue(SqQueue &Q){
    Q.rear=Q.front=0;
}
//入队
bool EnQueue(SqQueue &Q,BiTNode *e){
    if((Q.rear+1)%MAXSIZE==Q.front)
        return false;   //队满
    Q.data[Q.rear]=e;
    Q.rear=(Q.rear+1)%MAXSIZE;
    return true;
}
//出队
bool  DeQueue(SqQueue &Q,BiTNode *&x){
    if(Q.rear==Q.front)
        return false;   //队空
    x=Q.data[Q.front];
    Q.front=(Q.front+1)%MAXSIZE;
    return true;
}
//判队空
bool isEmpty(SqQueue Q){
    if(Q.rear==Q.front)
        return true;
    else
        return false;
}


//先序遍历创建二叉树
void createBiTree(BiTree &T){
    ElemType ch=getchar();
    if(ch=='#')
        T=NULL;
    else{
        T=(BiTNode *)malloc(sizeof(BiTNode));
        T->data=ch;
        createBiTree(T->lchild);
        createBiTree(T->rchild);
    }
}
//先序遍历输出二叉树
void PreOrder(BiTree T){
    if(T==NULL)
        return;
    else{
        cout<<T->data<<" ";
        PreOrder(T->lchild);
        PreOrder(T->rchild);
    }
}
//求深度
int getDepth(BiTree T){
    int dep1,dep2;
    if(T==NULL)
        return 0;
    else{
        dep1=getDepth(T->lchild);
        dep2=getDepth(T->rchild);
        return dep1>dep2? 1+dep1:1+dep2;
    }
}
//求宽度
int getWidth(BiTree T){
    SqQueue Q;
    InitQueue(Q);

    int oldNum=0;//每次遍历一层还剩余的结点数,表示正在循环的层次结点数
    int curNum=0;//当树的一层入队完成后保存的结点数,表示下一层的结点数,同时也表示该层的宽度
    int width;        //保留最大宽度
    BiTree x;
    BiTree p=T;
    if(p){
        EnQueue(Q,p);//第一层根结点入队
        oldNum++;
        width=1;
        while(!isEmpty(Q)){
            while(oldNum--){    //当正在循环的层的结点
                DeQueue(Q,x);   //首元素出队
                if(x->lchild){
                    EnQueue(Q,x->lchild);
                    curNum++;   //当前队列元素加一
                }
                if(x->rchild){
                    EnQueue(Q,x->rchild);
                    curNum++;
                }
            }
            if(curNum>width){
                width=curNum;
            }   //如果当前队列元素大于之前的,则更新宽度
            oldNum=curNum;
            curNum=0;
        }
    }

    return width;

}

int main() {
    //ABD##EH###CF##G##
    //视频链接【求二叉树宽度-哔哩哔哩】 https://b23.tv/WgRqtJH
    BiTree T;
    createBiTree(T);
    PreOrder(T);
    cout<<endl;
    cout<<"二叉树高度为:"<<getDepth(T)<<endl;
    cout<<"二叉树的宽度为:"<<getWidth(T)<<endl;
    return 0;
}

运行效果

在这里插入图片描述

以下是求二叉树高度宽度的完整代码(Python实现): ```python # 定义二叉树节点类 class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right # 计算二叉树高度函数 def get_tree_height(root): if not root: return 0 left_height = get_tree_height(root.left) right_height = get_tree_height(root.right) return max(left_height, right_height) + 1 # 计算二叉树宽度函数 def get_tree_width(root): if not root: return 0 queue = [(root, 0)] cur_level = 0 cur_level_width = 0 max_width = 0 while queue: node, level = queue.pop(0) if level == cur_level: cur_level_width += 1 else: max_width = max(max_width, cur_level_width) cur_level = level cur_level_width = 1 if node.left: queue.append((node.left, level + 1)) if node.right: queue.append((node.right, level + 1)) max_width = max(max_width, cur_level_width) return max_width # 测试代码 if __name__ == '__main__': root = TreeNode(1) root.left = TreeNode(2) root.right = TreeNode(3) root.left.left = TreeNode(4) root.left.right = TreeNode(5) root.right.left = TreeNode(6) root.right.right = TreeNode(7) print('树的高度为:', get_tree_height(root)) print('树的宽度为:', get_tree_width(root)) ``` 输出结果: ``` 树的高度为: 3 树的宽度为: 4 ``` 其中,`get_tree_height`函数用来计算二叉树高度,采用递归方式求解。`get_tree_width`函数用来计算二叉树宽度,采用BFS(广度优先搜索)算法,遍历每一层节点并统计宽度。测试代码中构建了一个示例二叉树,并输出了它的高度宽度
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

韭菜盖饭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值