创建二叉树 树的深度搜索 广度搜索

树的深度搜索 与树的前序遍历同理 根节点->左孩子->右孩子  树的广度搜索 与树的层次遍历同理 一层一层遍历内容

深度搜索 采用stack的适配器 先进后出原则  而广度搜索采用的queue适配器 先进先出原则 二者正好满足 搜索需求 简要代码如下:

#include <iostream>
#include <stack>
#include <queue>
#include <malloc.h>

using namespace std;

typedef struct node{
    char data;
    struct node* lchild;        //结构体并未定义完全 采用struct node* 类型
    struct node* rchild;
    node():lchild(NULL),rchild(NULL){}
}*Tree;

int index = 0;  //全局变量

//此处采用递归创建树,传入对象为引用类型,因为在新加入的左右孩子的同时,需要保存整棵树的结构
void createtree(Tree& root,char data[]){
    char e = data[index++];
    if(e == ‘#‘){
        root = NULL;
    }else{
    root = new node();
    root->data = e;
    createtree(root->lchild,data);  //递归创建左孩子
    createtree(root->rchild,data);  //递归创建右孩子
    }
}

void dfs(Tree root){
    stack<node*> nodestack;
    nodestack.push(root);
    node* node;
    while(!nodestack.empty()){
        node = nodestack.top();
        cout<<node->data<<" ";
        nodestack.pop();
        if(node->rchild){
            nodestack.push(node->rchild);
        }
        if(node->lchild){
            nodestack.push(node->lchild);
        }
    }
}

void bfs(Tree root){
    queue<node*> nodequeue;
    nodequeue.push(root);
    node* node;
    while(!nodequeue.empty()){
        node = nodequeue.front();
        nodequeue.pop();
        cout<<node->data<<" ";
        if(node->lchild){
            nodequeue.push(node->lchild);
        }
        if(node->rchild){
            nodequeue.push(node->rchild);
        }
    }
}

int main()
{

    char data[15] = {‘A‘, ‘B‘, ‘D‘, ‘#‘, ‘#‘, ‘E‘, ‘#‘, ‘#‘, ‘C‘, ‘F‘,‘#‘, ‘#‘, ‘G‘, ‘#‘, ‘#‘};
    Tree tree;
    createtree(tree,data);
    cout<<"dfs"<<":"<<endl;
    dfs(tree);
    cout<<endl;
    cout<<"bfs"<<":"<<endl;
    bfs(tree);

    return 0;
}

以上创建树的递归过程如下图分析:

只给出了一半树创建的过程,另一半创建的过程 与其一致。

最后创建完成树的图像即:

而本测试小例,产生的结果如下:

简单阐述了 树的深度,广度搜索。

创建二叉树 树的深度搜索 广度搜索,布布扣,bubuko.com

时间: 2024-10-13 07:02:35

创建二叉树 树的深度搜索 广度搜索的相关文章

基于C++ STL图的邻接表表示及深度、广度搜索实现

基于C++ STL图的邻接表表示及深度.广度搜索实现,对图论的学习有帮助,代码如下: #include <iostream> #include <vector> #include <set> using namespace std; #define MAX(a, b) ((a) > (b) ? (a) : (b) ) //定义图的定点 typedef struct Vertex { int id; vector<int> connectors; //存

图的深度及广度搜索

今天来学习下,图的遍历方法,我们以下面这个图为例. 开始之前呢,先说个题外话,我们用最常用的二维数组来存这个图,专业的叫法是邻接矩阵法,这好像不是题外话吧!!^_^要不要先自己想一下,上面这个图用邻接矩阵怎么存呢! 废话不多说,先来个深度的吧: 那什么叫深度搜索呢:以一个未访问过的顶点(图由顶点和边组成,不要说你不知道哦!)为起点,沿着当前顶点边走到未访问过的顶点,当没有未访问过的顶点时,回到该顶点的上一个顶点,继续走到其未访问过的顶点,直到所有顶点都被访问过.对文字不太感冒?来看下面的incl

第四章 搜索(深度、广度搜索、全排列、走迷宫、再解炸弹人、宝岛探险、水管工游戏)

一.深度优先搜索DFS 深度优先搜索DFS的关键思想是:当下应该怎么做(每个方法都试一遍),这一步解决后,进入下一步,下一步的解决方法和这一步的解决方法是一样的 DFS的基本模型 void dfs(int step) { 判断边界 尝试每一种可能  for(i=1;i<=n;i++) { 继续下一步 dfs(step+1) } 返回 } 1.1全排列 1 //输入一个数n 2 //输出1-n的全排列 3 #include <stdio.h> 4 int n, book[10], a[10

创建二叉树的所有深度上的节点链表

深搜: public static ArrayList<ArrayList<TreeNode>> getRes(TreeNode root){ ArrayList<ArrayList<TreeNode>> res = new ArrayList<ArrayList<TreeNode>>(); getRes(res,root,0); return res; } public static void getRes(ArrayList<

先序遍历创建二叉树,对二叉树统计叶子节点个数和统计深度(创建二叉树时#代表空树,序列不能有误)

#include "stdio.h" #include "string.h" #include "malloc.h" #define NULL 0 #define MAXSIZE 30 typedef struct BiTNode      //定义二叉树数据结构 { char data; struct BiTNode *lchild,*rchild; } BiTNode; void preCreate(BiTNode *& T)   /

二叉树的最小深度——广度优先搜索

题目描述: 给定一个二叉树,找出其最小深度. 二叉树的最小深度为根节点到最近叶子节点的距离. 解题思路: 这个题目比较简单. 对于二叉树的问题,首先想到的是采用递归,广度优先搜索. 一个节点一个节点地遍历,直到第一次找到叶子节点为止. 注意编程的细节,代码里面有注释 参考代码:(C++) <span style="font-size:18px;">/** * Definition of TreeNode: * class TreeNode { * public: * int

迷宫问题解决方法:分别基于深度搜索和广度搜索的思想来实现

本文针对迷宫问题,探讨解决思路并给出实现代码.在本文中,采用的图的深度优先搜索和广度优先搜索两种方法分别对迷宫的路径进行了求解. 首先来看迷宫问题的描述,可以参考此处,简而言之就是,通过一个二维数组(int型)来表示迷宫,迷宫中0表示可行,1表示不可行.在本文的实现中,可以输入给定迷宫,定义迷宫入口和出口,并查找迷宫路径. 总体的描述:在本文中,定义了结构体Node,用于存放节点信息,而Node内只有两个变量,标识节点的行坐标与列坐标.定义了迷宫类maze,并分别定义了相应的get.set函数,

广度优先搜索求树的深度

#include<iostream> #include<vector> #include<stack> #include<string> #include<queue> #include<algorithm> #include<numeric> using namespace std; class node{ public: int val; node* left; node* right; node():val(0),l

基于深度及广度优先搜索的迷宫问题的演示

1 时间复杂度分析 由于该图采用邻接矩阵存储,整个算法遍历的过程所花费的时间复杂度为该矩阵的N(row*col).而由于其需要分别访问已经定位,需要进行分别2次操作,如下: visited = new bool[col*row];//访问标记 for (i=0; i<row; i++) for (j=0; j<col; j++) visited[i*col+j] = false;//初始为未访问状态 position = new POSITION[col*row]; for (i=0; i&l