第六章例题二叉树层次遍历

1.指针实现

#include <iostream>
#include <vector>
#include <queue>
#include <cstdio>
#include <cstring>

using namespace std;

#define maxn 100

struct Node
{
    bool have_value;
    int value;
                    /*节点结构体*/
    Node *left,*right;
    Node():have_value(false),left(NULL),right(NULL){}

};

                /*全局变量写起来更方便*/
char s[maxn];
Node* root=NULL;
bool faile;

                /*用来防止内存泄漏*/
void remove_tree(Node* tree)
{
    if(tree==NULL) return;

    remove_tree(tree->left);
    remove_tree(tree->right);

    delete tree;
}

                /*创建新节点封装成函数*/
Node* newnode() { return new Node();}

                /*添加新节点的函数*/
void addnode(int v,char* s)
{
    int n=strlen(s);

    Node* u=root;

    for(int i=0;i<n;i++)
    {
        if(s[i]==‘L‘)
        {
            if(u->left==NULL)
                u->left=newnode();
            u=u->left;
        }
        else if(s[i]==‘R‘)
        {
            if(u->right==NULL)
                u->right=newnode();
            u=u->right;
        }
    }

    if(u->have_value) faile=true;

    u->value=v;
    u->have_value=true;
}

                /*读入数据并创建树,成功返回true读到文件结尾则返回false*/
bool read_input()
{
    faile=false;

    remove_tree(root);
    root=newnode();

    for(;;)
    {
        if(scanf("%s",s)!=1) return false;
        if(!strcmp(s,"()")) break;

        int v;
        sscanf(&s[1],"%d",&v);
        addnode(v,strchr(s,‘,‘)+1);
    }

    return true;
}

                /*宽度优先算法,用队列实现将结果存在向量中*/
bool bfs(vector<int>& ans)
{
    queue<Node*> q;
    ans.clear();

    q.push(root);

    while(!q.empty())
    {
        Node* u=q.front();
        q.pop();

        if(!u->have_value) return false;

        ans.push_back(u->value);

        if(u->left!=NULL) q.push(u->left);
        if(u->right!=NULL) q.push(u->right);
    }

    return true;
}

int main()
{

    vector<int> v;

    while(read_input())
    {
        if(!bfs(v) || faile==true)
            printf("%d\n",-1);
        else
            for(vector<int>::iterator i = v.begin(); i != v.end(); ++i)
                printf("%d ",*i);

        cout<<endl;
    }

}

2.数组实现

#include <iostream>
#include <vector>
#include <queue>
#include <cstdio>
#include <cstring>

using namespace std;
#define maxn 1000

bool have_value[maxn];
int tleft[maxn];
int tright[maxn];
int value[maxn];
char s[100];
bool faile;

const int root=1;
int cnt;

void newtree()
{
    tleft[root]=0;
    tright[root]=0;

    have_value[root]=false;
    cnt=root;
}

int newnode()
{
    int u=++cnt;

    tleft[u]=0;
    tright[u]=0;

    have_value[u]=false;

    return u;
}

void addnode(int v,char* s)
{
    int n=strlen(s);

    int u=root;

    for(int i=0;i<n;i++)
    {
        if(s[i]==‘L‘)
        {
            if(tleft[u]==0)
                tleft[u]=newnode();
            u=tleft[u];
        }
        else if(s[i]==‘R‘)
        {
            if(tright[u]==0)
                tright[u]=newnode();
            u=tright[u];
        }
    }

    if(have_value[u]) faile=true;

    value[u]=v;
    have_value[u]=true;
}

bool read_input()
{
    faile=false;

    newtree();

    for(;;)
    {
        if(scanf("%s",s)!=1) return false;
        if(!strcmp(s,"()")) break;

        int v;
        sscanf(&s[1],"%d",&v);
        addnode(v,strchr(s,‘,‘)+1);
    }

    return true;
}

bool bfs(vector<int>& ans)
{
    queue<int> q;
    ans.clear();

    q.push(root);

    while(!q.empty())
    {
        int u=q.front();
        q.pop();

        if(!have_value[u]) return false;

        ans.push_back(value[u]);

        if(tleft[u]!=0) q.push(tleft[u]);
        if(tright[u]!=0) q.push(tright[u]);
    }

    return true;
}

int main()
{

    vector<int> v;

    while(read_input())
    {
        if(!bfs(v) || faile==true)
            printf("%d\n",-1);
        else
            for(vector<int>::iterator i = v.begin(); i != v.end(); ++i)
                printf("%d ",*i);

        cout<<endl;
    }

}

书上的接口写的太棒了,换了种实现方式,代码基本上没改,比我自己写的接口不知道高到哪里去了.

时间: 2024-10-12 19:59:00

第六章例题二叉树层次遍历的相关文章

算法入门经典第六章 例题6-14 Abbott的复仇(Abbott&#39;s Revenge)BFS算法实现

Sample Input 3 1 N 3 3 1 1 WL NR * 1 2 WLF NR ER * 1 3 NL ER * 2 1 SL WR NF * 2 2 SL WF ELF * 2 3 SFR EL * 0 Sample Output (3,1) (2,1) (1,1) (1,2) (2,2) (2,3) (1,3) (1,2) (1,1) (2,1) (2,2) (1,2) (1,3) (2,3) (3,3) 析 题目的大意是,输入起点,离开起点时的朝向和终点,求一条最短路. 每一个

【数据结构】二叉树层次遍历

package 蓝桥练习; public class 二叉树层次遍历 { public static int MAXSIZE = 100; public static Node queue[] = new Node[MAXSIZE]; public static void main(String[] args) { Node h = new Node('H', null, null); Node i = new Node('I', null, null); Node f = new Node('

java实现二叉树层次遍历

public class BSTNode<T extends Comparable<T>> { T key; // 关键字(键值) BSTNode<T> left; // 左孩子 BSTNode<T> right; // 右孩子 BSTNode<T> parent; // 父结点 public BSTNode(T key, BSTNode<T> parent, BSTNode<T> left, BSTNode<T&g

毕业了C++二叉树层次遍历

//代码经过测试,赋值粘贴即可用#include<iostream> #include<stdio.h> #include<stack> #include<queue> #include<malloc.h> using namespace std; //二叉树结点 typedef struct BTNode{ char data; struct BTNode *lchild; struct BTNode *rchild; }BTNode; //模

毕业了-java二叉树层次遍历算法

/*************************************** * 时间:2017年6月23日 * author:lcy * 内容:二叉树的层次遍历 * 需要借助队列这个数据结构,直接import就可以了 * 1.首先将根节点放入队列中. 2.当队列为非空时,循环执行步骤3到步骤5,否则执行6: 3.出队列取得一个结点,访问该结点: 4.若该结点的左子树为非空,则将该结点的左子树入队列: 5.若该结点的右子树为非空,则将该结点的右子树入队列: 6.结束. ***********

1040. 二叉树层次遍历

Description 给出一棵二叉树,求它的层次遍历结果. [二叉树的遍历问题是一种精神,务必领会] Input Format 第一行,N<1000000,表示二叉树节点数. 默认序号为0的节点为树根.接下来共N-1行,依次表示序号为1,...,N-1的节点的父亲节点序号. 如果一个节点有两个孩子节点,左孩子节点序号总是小于右孩子节点序号. Output Format 仅一行,二叉树的层次遍历结果.节点序号间用空格隔开. Hint Sample Input 6 0 1 1 0 4 Sample

二叉树层次遍历(剑指Offer面试题32:从上到下打印二叉树)

图1所示为二叉树的层次遍历,即按照箭头所指方向,按照1.2.3的层次顺序,对二叉树每个节点进行访问 (此图反映的是自左至右的层次遍历,自右至左的方式类似). 要进行层次遍历,需要建立一个队列.先将二叉树头节点入队列,然后出队列,访问该节点, 如果它有左子树,则将左子树的根结点入队:如果它有右子树,则将右子树的根结点入队.然后出队列,对出队节点访问, 如此反复直到队列为空为止. 1 import java.util.*; 2 class TreeNode 3 { 4 int val; 5 Tree

编程之美——二叉树层次遍历

方法一:从根节点开始,将每层节点压入一个数组,cur代表当前访问节点,last代表下一层第一个节点,遍历数组可得层次遍历: 代码: 1 #include<iostream> 2 #include<queue> 3 #include<vector> 4 using namespace std; 5 6 template<class T> 7 class binaryTree 8 { 9 struct node 10 { 11 T elem; 12 node *

二叉树层次遍历_判断结点所属层次

#include<stdlib.h> #include<stdio.h> #include<stack> #define N 50 using namespace std; typedef struct tree{ char ch; struct tree *lchild; struct tree *rchild; }BitTree; //数组输入 BitTree *CreateTree(int A[], int i, int n){ BitTree *bt; if(i