二叉树的bfs建立

在确定只有N个元素的时候,使用bfs建立二叉树的方法。

#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
#define N 10000

struct Node
{
    Node* l;
    Node* r;
    int data;
};

Node* NewNode() {
    Node* n = (Node*)malloc(sizeof(Node));
    if (n) {
        n->l = NULL;
        n->r = NULL;
        n->data = -1;
    }
    return n;
}

Node* create()
{
    queue<Node*> q;
    Node* root = NewNode();
    q.push(root);
    int lmt = 1;
    while (!q.empty())
    {
        Node* p = q.front();
        cin >> p->data;
        q.pop();
        if (lmt + 2 <= N) {
            Node* l = NewNode();
            Node* r = NewNode();
            p->l = l;
            p->r = r;
            q.push(l);
            q.push(r);
            lmt += 2;
        } else if (lmt + 1 == N) {
            Node* l = NewNode();
            p->l = l;
            q.push(l);
            lmt += 1;
        } else if (lmt == N) {
            break;
        }
    }
    while (!q.empty()) {
        cin >> q.front()->data;
        q.pop();
    }
    return root;
}

void bfs(Node* root) {
    queue<Node*> q;
    q.push(root);
    int lmt = 1;
    while (!q.empty()) {
        if (lmt > N) break;
        Node* p = q.front();
        cout << p->data << " ";
        lmt++;
        q.pop();
        if (p->l) q.push(p->l);
        if (p->r) q.push(p->r);
    }
    cout << endl;
}

void dfs(Node* n) {
    if (!n) return ;
    cout << n->data << " ";
    dfs(n->l);
    dfs(n->r);
}

int main() {
    Node* root = create();
    bfs(root);
    dfs(root);
    return 0;
}

  

时间: 2024-10-06 03:23:27

二叉树的bfs建立的相关文章

二叉树的前序建立,前中后序遍历的非递归算法

二叉树的前序建立递归算法以及前中后序遍历的递归算法已经是人尽皆知了,递归算法也确实为代码的编写带来了很大的方便.然而,有时我们也确实需要它们的非递归算法.将递归算法转化为非递归算法可以帮助我们深入了解函数的调用与栈的原理.这里总结一下二叉树的这些重要的非递归算法. 一.前序建树 前序建树的基本思路是,接收用户输入的一组字符串,其中'#'代表空树,其他代表树结点的数据域值.例如,要建立如下一棵树 需要输入"AB#D##C##". 而非递归的思路是,1.设一个标志位来判断当前创建的结点是左

树(二叉树)的建立和遍历算法(一)(前序,中序,后序)

最近学习树的概念,有关二叉树的实现算法记录下来... 不过学习之前要了解的预备知识:树的概念:二叉树的存储结构:二叉树的遍历方法.. 二叉树的存储结构主要了解二叉链表结构,也就是一个数据域,两个指针域,(分别为指向左右孩子的指针),从下面程序1,二叉树的存储结构可以看出. 二叉树的遍历方法:主要有前序遍历,中序遍历,后序遍历,层序遍历.(层序遍历下一篇再讲,本篇主要讲的递归法) 如这样一个二叉树: 它的前序遍历顺序为:ABDGHCEIF(规则是先是根结点,再前序遍历左子树,再前序遍历右子树) 它

Python --- 二叉树的层序建立与三种遍历

二叉树(Binary Tree)时数据结构中一个非常重要的结构,其具有....(此处省略好多字)....等的优良特点. 之前在刷LeetCode的时候把有关树的题目全部跳过了,(ORZ:我这种连数据结构都不会的人刷j8Leetcode啊!!!) 所以 !!!敲黑板了!!!今天我就在B站看了数据结构中关于树的内容后,又用我浅薄的Python大法来实现一些树的建立和遍历. 关于树的建立我觉得层序建立对于使用者来说最为直观,输入很好写.(好吧,我是看LeetCode中的树输入都是采用层序输入觉得非常好

c之二叉树链表操作---建立、(递归)前序遍历、中序遍历、后序遍历

[二叉树链表] 1.节点定义: typedef struct node{ int data; struct node*lchild,*rchild; }Tree,*BiTree; 2.创建二叉树: BiTree creat_Tree(BiTree root,int num){//建立二叉树 if(root==NULL) { root=(Tree *)malloc(sizeof(Tree)); if(root==NULL) { printf("no memory available\n"

【王道例3.4】通过二叉树遍历结果建立二叉树

题目 思路 根据先序遍历可以知道第一个字符一定是根节点,然后在中序遍历中,找到对应的根节点,则其左边的字母组成了左子树,右边的字母组成了右子树. 例如示例中: 代码 #include<bits/stdc++.h> using namespace std; typedef struct BiNode{ struct BiNode *lchild; struct BiNode *rchild; char data; }*BiTree; string s1,s2; //s1存储前序遍历,s2存储中序

c语言二叉树的递归建立

#include <stdio.h> #include <string.h> #include <stdlib.h> #include <malloc.h> typedef struct node{ TYPE data; struct node *leff; struct node *right; }Node,*pNode; typedef char TYPE; typedef struct node{ TYPE data; struct node *lef

数据结构之二叉树的递归建立和遍历(续)

特此说明:上篇文章和这篇文章中的二叉树是链式二叉树的,不是顺序二叉树. 1.基本概述 A.层次遍历 摘自:http://blog.sina.com.cn/s/blog_5207b6c401009fq0.html 要采用的数据结构是队列.具体描述如下: 层次遍历:从上到下.从左到右依次访问结点.每次访问结点,就将该节点记录下来:若记录的所有结点都已经处理完毕,则结束遍历,否则重复下面的重装: 取出记录中第一个还没有访问的树的结点,若他有左子树,则访问左子树,并将其记录下来,否则,访问其右子树,并记

数据结构之二叉树的递归建立和遍历

1.二叉树概念 这里,得先明白树的概念 摘自:维基百科 在计算机科学中,树(英语:tree)是一种抽象资料型别(ADT)或是实作这种抽象资料型别的数据结构,用来模拟具树状结构性质的资料集合.它是由n(n>=1)个有限节点组成一个具有层次关系的集合.把它叫做"树"是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的.它具有以下的特点: 每个节点有零个或多个子节点: 没有父节点的节点称为根节点: 每一个非根节点有且只有一个父节点: 除了根节点外,每个子节点可以分为多个不相交的

二叉树的建立及递归遍历

huangjing 二叉树的的建立方式为前序  二叉树有三种遍历  前序遍历(NLR)  中序遍历(LNR)  后续遍历(LRN) 非递归的算法明天补上 代码为: #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<map> #include<vector> #include