(经典)二叉树的层次遍历和快速排序

//层次遍历
void LevelOrder(BiTree T) ///////MDMDMD  这里是BiTree 不是BTNode
{  

    //管他啥linkedlist还是什么list,类型出现的地方很少,queue容器装入的是指针类型
    queue<BiTree> queue;

    queue.push(T);         //算法1:根结点入队列

    while(!queue.empty()){ //算法2:若队列非空则循环执行算法3到5

        T = queue.front(); //算法3:对头元素出队,指针从新指向,front()方法是将返回队头元素
        printf("%c",T->data);//队头元素出队然后将队头元素的左右孩子入队
        queue.pop();//pop是出队

        if(T->lchild != NULL){//算法4:左子树不空,将左子树入队
            queue.push(T->lchild);//入队的就是一个地址元素
        }

        if(T->rchild != NULL){//算法5:右子树不空,将右子树入队
            queue.push(T->rchild);
        }
    }
}

void quicksort(int a[],int left,int right)
{    int i=left;int j=right;int temp;

     if(i>j) return;//这是一个隐藏的大bug,必须是大于符号

     temp=a[i];   //算法1:将数组中最左端的那个元素当做哨兵
     while(i<j)   //算法2:若i<j则循环执行算法3到4
     {
        while(a[j]>=temp&&j>i)  j--; //算法3:从后向前找一个比哨兵小的元素并放入i指向的位置
        if(j>i)    a[i++]=a[j];

        while(a[i]<=temp&&j>i)   i++;//算法4:..........
        if(j>i)     a[j--]=a[i];
     }
     a[i]=temp;//算法5:经过一趟排序,左边的比他小,右边的元素比他大

    quicksort(a,left,i-1);//像二叉树的递归遍历
    quicksort(a,i+1,right);//也像二分查找的递归算法
}

int main()
{      int k;//黑盒测试,测了很多遍正确
    int a[]={-44,-90,81110,80,1,1,1,-99,-99,-99};   //>=   <=即使没有等号也可以成立
    quicksort(a,0,9);
    for(k=0;k<=9;k++)
    printf("%d\n",a[k]);

    return 0;
}

时间: 2024-11-08 16:53:29

(经典)二叉树的层次遍历和快速排序的相关文章

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

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

二叉树的层次遍历(队列) 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

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;}

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

#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 r

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

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

树——二叉树的层次遍历

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