二叉树的层次遍历和(叶子)节点

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define size 100
#define resize 10
typedef struct Bitnode{        //定义结点
    char data;
    struct Bitnode *lchild,*rchild;
}Bitnode,*Bitree;

typedef struct {             //定义队列
    Bitree *base;
    int front;
    int rear;
}Queue;

int count=0;

void Initqueue(Queue &Q)            //建立队列
{
    Q.base=(Bitree*)malloc(size*sizeof(Queue));
    if(!Q.base)
        exit(0);
    Q.front=Q.rear=0;
}

Bitree Enqueue(Queue &Q,Bitree e)        //入队列
{
    if((Q.rear+1)%size==Q.front)        //循环队列
        return 0;
    Q.base[Q.rear]=e;
    Q.rear=(Q.rear+1)%size;
    return e;
}

int Queueempty(Queue Q)          //队列的判空操作
{
    if(Q.front==Q.rear)
        return 1;
    return 0;
}

void Dequeue(Queue &Q,Bitree &e)          //出队列
{

    if(Q.front==Q.rear)
        exit(0);
    e=Q.base[Q.front];
    Q.front=(Q.front+1)%size;
}
void Createbitree(Bitree &bt)
{
    //建立二叉树的二叉链表
    char ch;
    ch=getchar();
    if(ch==‘#‘)
        bt=NULL;
    else
    {
        bt=(Bitree)malloc(sizeof(Bitnode));
        bt->data=ch;
        bt->lchild=bt->rchild=NULL;
        count++;
        Createbitree(bt->lchild);
        Createbitree(bt->rchild);
    }
}

void Levelordertraverse(Bitree bt)       //二叉树的层次遍历
{
    Bitree p;
    Queue Q;
    if(bt)
    {
        Initqueue(Q);
        Enqueue(Q,bt);
        while(!Queueempty(Q))
        {
            Dequeue(Q,p);
            printf("%c ",p->data);
            if(p->lchild)
                Enqueue(Q,p->lchild);
            if(p->rchild)
                Enqueue(Q,p->rchild);
        }
    }
    printf("\n");
}

void Leafnode(Bitree bt)        //找叶子结点
{
    Bitree p;
    Queue Q;
    if(bt)
    {
        Initqueue(Q);
        Enqueue(Q,bt);
        while(!Queueempty(Q))
        {

            Dequeue(Q,p);
            if(p->lchild||p->rchild)
            {
                if(p->lchild)
                Enqueue(Q,p->lchild);
                 if(p->rchild)
                Enqueue(Q,p->rchild);
            }
            else
            printf("%c ",p->data);
        }
    }
    printf("\n");
}

int main()
{
    Bitree bt;
    Createbitree(bt);
    printf("层次遍历二叉树:\n");
    Levelordertraverse(bt);
    printf("输出叶子结点:\n");
    Leafnode(bt);
    printf("输出结点总数:%d\n",count);
    return 0;
}

//ABD###CE##F##
时间: 2024-08-01 05:03:20

二叉树的层次遍历和(叶子)节点的相关文章

二叉树的层次遍历(队列) and 二叉搜索树的后序遍历序列

(一)从上往下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印.[层次遍历] 从上到下打印二叉树的规律:每一次打印一个节点的时候,如果该节点有子节点,则把该节点的子节点放到一个队列的末尾.接下来到队列的头部取出最早进入队列的节点,重复前面的操作,直至队列中所有的节点都被打印出来为止. //二叉树的层次遍历#include<iostream>#include<queue>using namespace std; typedef int ElemType;typedef st

二叉树的层次遍历 II

二叉树的层次遍历 II 给出一棵二叉树,返回其节点值从底向上的层次序遍历(按从叶节点所在层到根节点所在的层遍历,然后逐层从左往右遍历) 样例 给出一棵二叉树 {3,9,20,#,#,15,7}, 3 / 9 20 / 15 7 按照从下往上的层次遍历为: [ [15,7], [9,20], [3] ] 标签 二叉树 队列 二叉树遍历 宽度优先搜索 1 /** 2 * Definition of TreeNode: 3 * class TreeNode { 4 * public: 5 * int

二叉树之层次遍历

 下面是对层次遍历的一个实例,如果对二叉树不太了解请点击这里 任务要求:输入一棵二叉树,进行层次遍历,每个节点都按照从根节点到他的移动序列给出(L表示左,R表示右).在输入中,每个节点的左右括号之间没有空格,相邻节点之间用一个空格隔开.每棵数的输入用一队空括号 () 表示结束(这对括号本身并不代表一个节点),如图所示. (画的略丑) 注意:如果从根到某个叶节点的路径上有的节点没有在输入中给出,或者给出超出了一次应当输出 -1.节点数不超过 256. 样例输入: (11,LL) (7,LLL)

lintcode 中等题:binary tree level order traversal ii 二叉树的层次遍历II

题目 二叉树的层次遍历 II 给出一棵二叉树,返回其节点值从底向上的层次序遍历(按从叶节点所在层到根节点所在的层遍历,然后逐层从左往右遍历) 样例 给出一棵二叉树 {3,9,20,#,#,15,7}, 3 / 9 20 / 15 7 按照从下往上的层次遍历为: [ [15,7], [9,20], [3] ] 解题 和上一题的答案反过来 直接每次在list中第一个位置加入当前层结点 /** * Definition of TreeNode: * public class TreeNode { *

二叉树的层次遍历和其深度

//二叉树的层次遍历和其深度#include <cstdio>#include <cstdlib>//define _OJ_#define maxsize 100typedef struct tree1{    char data;    struct tree1 *lchild;    struct tree1 *rchild;} tree1, *tree; typedef struct queue1{    tree data;    struct queue1 *next;}

数据结构——链队列实现二叉树的层次遍历

在二叉树的遍历这篇博客中https://www.cnblogs.com/wkfvawl/p/9901462.html 对于二叉树的层次遍历我只是给出了基于C++ STL的代码,这里我使用数据结构的链表,构建一个链队列来实现.这也算是我第一次使用链队列来完成某个任务,链队列代码还是来自课本,因为之前使用C++ STL时,queue中的某些函数是有返回值的列如Q.front(),而有些却没有返回值像Q.push(p),Q.pop(),就连有没有参数也是不同的,在这里我没有改动课本上的代码来适应自己的

重建二叉树与二叉树的层次遍历

数据结构实验之求二叉树后序遍历和层次遍历 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描写叙述 已知一棵二叉树的前序遍历和中序遍历,求二叉树的后序遍历. 输入 输入数据有多组,第一行是一个整数t (t<1000).代表有t组測试数据.每组包含两个长度小于50 的字符串,第一个字符串表示二叉树的先序遍历序列,第二个字符串表示二叉树的中序遍历序列. 输出 每组第一行输出二叉树的后序遍历序列,第二行输出二叉树的层次遍历序列 演示样例输

树——二叉树的层次遍历

1,二叉树的遍历: 1,二叉树的遍历(Traversing Binary Tree)是指从根结点出发,按照某种次序依次访问二叉树中的所有结点,使得每个结点被访问一次,且仅被访问一次: 1,层次就是访问的次序,层次遍历是先访问第一层.再第二层等: 2,考虑的问题: 1,通用树结构的层次遍历算法是否可以用在二叉树结构上?如果可以,代码需要做怎样的改动? 1,可以的,二叉树是一种特别的树: 2,通用树使用的算法可以移植到二叉树使用的场合: 3,设计思路(游标): 1,提供一组遍历相关的函数,按层次访问

PTA 二叉树的层次遍历

6-6 二叉树的层次遍历 (6 分) 本题要求实现给定的二叉树的层次遍历. 函数接口定义: void Levelorder(BiTree T); T是二叉树树根指针,Levelorder函数输出给定二叉树的层次遍历序列,格式为一个空格跟着一个字符. 其中BinTree结构定义如下: typedef char ElemType; typedef struct BiTNode { ElemType data; struct BiTNode *lchild, *rchild; }BiTNode, *B