C语言实现最大二叉树并按层遍历



题目:给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下:

  1. 二叉树的根是数组中的最大元素。
  2. 左子树是通过数组中最大值左边部分构造出的最大二叉树。
  3. 右子树是通过数组中最大值右边部分构造出的最大二叉树。

通过给定的数组构建最大二叉树,并且输出这个树的根节点。

Example 1:

输入: [3,2,1,6,0,5]
输入: 返回下面这棵树的根节点:

      6
    /      3     5
    \    /
     2  0
               1

分析:(1)通过审题可知通过先序创建二叉树进行创建,即创建根节点,左子树,右子数。 所以选择递归的方法进行创建。             visit(T);             createleftTree(T->left);             creatterightTree(T->right);      (2)找数组中的最大值,类似于二分查找, 用三个游标low,high,temp分别来跟踪所要查找的数组中的低位、高位、和最大值的位置。             temp   根节点                             [low , temp-1]左子树             [temp+1, high]右子数

(3)根据题意,输出时需要将二叉树按层输出,即按层遍历,使用队列实现,队列的特性FIFO 。(1)根节点入队列-》(2)根节点出队列并输出-》(3)左子树入队列-》(4)右子数入队列-》(3)

定义二叉树结点:typedef struct TreeNode{     int val;       struct TreeNode *left;     struct TreeNode *right;}TreeNode;定义队列链表结点:typedef struct QNode{    QueuePtr val;    QNode *next;}QNode,*QueuePtr;定义队列:typedef struct Queue{    QueuePtr front;    QueuePtr  rear;}Queue;//Q.front 指向队列链表的头结点;  Q.rear  指向队列链表的尾结点;入队列时在Q.rear后加结点,出队列时在Q.front删结点

源代码:/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/#include<stdio.h>#include<stdlib.h>

struct TreeNode {    int val;    struct TreeNode *left;    struct TreeNode *right;    };//定义链表队列typedef struct QNode {    struct TreeNode *val;      struct QNode *next;}QNode, *QueuePtr;typedef struct Queue {    QueuePtr rear ; //队列尾指针     QueuePtr front; //队列头指针}Queue;// 找出数组中最大的数int searchMaxnum(int *nums, int low, int high, int *location) {    int max = -1;    int i;    i = low;    while (i <=high) {        if (max< (*(nums + i)))        {            max = *(nums + i);            *location = i;        }        i++;

    }    return max;

}void createTree(struct TreeNode** p, int *count, int * nums, int low, int *location, int high) {    struct TreeNode* q;    int t,max, t_right, t_left;;        if (low > high)    {        return;    }      if (count == 0)        return;    max = searchMaxnum(nums, low, high, location);    if (max == -1)        return;    *p = q = (struct TreeNode*)malloc(sizeof(struct TreeNode));    (*p)->val = max;    (*p)->left = NULL;    (*p)->right = NULL;    (*count)--;    t_left = (*location) - 1;    t_right = (*location) + 1;    createTree(&((*p)->left), count, nums, low, location, t_left);    createTree(&((*p)->right), count, nums, t_right, location, high);

}

struct TreeNode* constructMaximumBinaryTree(int* nums, int numsSize) {    int maxleft, location,t, t_right, t_left;    int count = numsSize;    int low = 0;    int high = numsSize - 1;    struct TreeNode* p = NULL;    p = (struct TreeNode*)malloc(sizeof(struct TreeNode));    p->val = searchMaxnum(nums, low, high, &location);    count--;    (p)->left = NULL;    (p)->right = NULL;    t_left = location-1;    t_right = location + 1;

    //createTree(&p, searchMaxnum(nums, low, high, &location), &count, nums, &low, &location, &high);    createTree(&(p->left), &count, nums, low, &location, t_left);    createTree(&(p->right), &count, nums, t_right, &location, high);    return p;}//入队列void enqueue(Queue *s, struct TreeNode *t) {    QNode *p;

        p = (QNode *)malloc(sizeof(QNode));        s->rear->next = p;            (s)->rear = p;                (s)->rear->val = t;        (s)->rear ->next= NULL;    }void dequeue(Queue *s, struct TreeNode **t) {    QNode *p;    (*t) = (s)->front->next->val;    p = (s)->front;    (s)->front=(s)->front->next;    free(p);}void main() {    int num[8] = { 3,2,1,6,0,5,10,20};    struct TreeNode* p,*q,*t;  //定义树节点    int count = 8;    Queue sq; //定义一个队列    t = NULL;    struct TreeNode* temp = NULL;//创建最大二叉树    p = constructMaximumBinaryTree(num, count);    //printf("%d", p->val);    q = p;    //head=sq = NULL;//    sq->head = sq->rear;    //创建队列头结点,为空结点    sq.front = (QueuePtr)malloc(sizeof(QNode));    sq.rear = sq.front;    sq.rear->next = NULL;    //根节点入队列    if (p != NULL)    {        enqueue(&sq, p );    }    count = 8;    //按层遍历二叉树    while ((sq.front)!=(sq.rear)&& count!=0)    {            dequeue(&sq,&t);

            if (t != temp)            {                printf("%d ", (t)->val);                if ((t)->left != NULL)                {                    enqueue(&sq, (t)->left);//左孩子入队列                }                else                    enqueue(&sq, temp);                if ((t)->right != NULL)                {                    enqueue(&sq, (t)->right);                }                else                    enqueue(&sq, temp);                count--;            }            else                printf("null ");                                }}

原文地址:https://www.cnblogs.com/feifiefighting/p/9069451.html

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

C语言实现最大二叉树并按层遍历的相关文章

数据结构——二叉树遍历之“层遍历”

系列文章:数据结构与算法系列——从菜鸟到入门 层次遍历 二叉树的层次遍历是指,从二叉树的第一层(根结点)开始,从上至下逐层遍历,在同一层中从左至右依次遍历. 设置一个队列,将二叉树的根结点放入队列中. 将队列中的头结点出队,赋值给临时变量 temp,同时输出打印 temp.val. 判断 temp 是否有左结点和右结点,若有,分别将左.右结点放入队列中. 重复步骤 2~3,直至队列为空,表示二叉树的层次遍历结束. private static void cengci(TreeNode root)

二叉树的按层遍历

常见的前序.中序.后序都很常见,最近用到了按层遍历,记录一下: 思路:用一个队列来作为辅助空间.依次存储头结点,左节点和右节点.每次循环输出节点的值,直到队列为空这样一来就利用了队列先进先出的性质实现了非递归按层遍历二叉树. 具体实现: void levelOrderTraverse(const BiTree& t) { queue<BiTree> q; BiTree p = NULL; if(t) { q.push(t); } while(!q.empty()) { p = q.fr

二叉树(6)----按层遍历二叉树

1.二叉树定义 typedef struct BTreeNodeElement_t_ { void *data; } BTreeNodeElement_t; typedef struct BTreeNode_t_ { BTreeNodeElement_t *m_pElemt; struct BTreeNode_t_ *m_pLeft; struct BTreeNode_t_ *m_pRight; } BTreeNode_t; 2.按层遍历二叉树 第一步:需要借助队列,首先将根节点pRoot入队:

二叉树中序遍历 (C语言实现)

在计算机科学中,树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的结构.二叉树是每个节点最多有两个子树的有序树.通常子树被称作“左子树”(left subtree)和“右子树”(right subtree).二叉树常被用于实现二叉查找树和二叉堆. 如下是实现创建二叉树和二叉树中序遍历的代码: 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <memory.h> 4 5 t

二叉树6----一层二叉树的遍历

1.二叉树定义 typedef struct BTreeNodeElement_t_ { void *data; } BTreeNodeElement_t; typedef struct BTreeNode_t_ { BTreeNodeElement_t *m_pElemt; struct BTreeNode_t_ *m_pLeft; struct BTreeNode_t_ *m_pRight; } BTreeNode_t; 2.按层遍历二叉树 第一步:须要借助队列,首先将根节点pRoot入队:

二叉树的建树,按层遍历,结点总数,页结点以及深度

建立一颗二叉树: #include "handsomecui.h" typedef struct Node{ char data; Node *left, *right; }Node, *Tree; Tree build(){ char c; SI(c); if(c == '#'){ return NULL; } else{ Node *root = new Node; root->data = c; root->left = build(); root->right

二叉树后序遍历的非递归算法(C语言)

首先非常感谢‘hicjiajia’的博文:二叉树后序遍历(非递归) 这篇随笔开启我的博客进程,成为万千程序员中的一员,坚持走到更远! 折磨了我一下午的后序遍历中午得到解决,关键在于标记右子树是否被访问过,考虑过修改二叉树结点的数据结构,增加一个visit域,或者建一个栈存储已访问的结点.都比较麻烦没有调试成功.若将右子树也入栈,如果没有访问标记的话,会改变访问的次序,甚至出现死循环,这是比较危险的情况.从借鉴的博文里,摘录并改写为C的代码,基本上没有改动.后续问题努力写出自己的原创代码. 二叉树

SDUT 3341 数据结构实验之二叉树二:遍历二叉树

数据结构实验之二叉树二:遍历二叉树 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 已知二叉树的一个按先序遍历输入的字符序列,如abc,,de,g,,f,,, (其中,表示空结点).请建立二叉树并按中序和后序的方式遍历该二叉树. Input 连续输入多组数据,每组数据输入一个长度小于50个字符的字符串. Output 每组输入数据对应输出2行:第1行输出中序遍历序列:第2行输出后序遍历序列

C语言实现有序二叉树(1)

在cpp中使用的C语言 头文件 1 /* 有序二叉树 BsTree */ 2 #ifndef _BT_H 3 #define _BT_H 4 /*节点*/ 5 typedef struct BsTreeNode 6 { 7 int data;/* 数据 */ 8 struct BsTreeNode* left;/* 左子树 */ 9 struct BsTreeNode* right;/* 右子树 */ 10 }BSTREE_NODE; 11 /* 二叉树 */ 12 typedef struct