数据结构4——linuxC(二叉树和排序算法)

简介: 数据结构4——linuxC(二叉树和排序算法)

对于二叉树而言,有如下特性:


1.第i层上,最多有2^(i-1)个节点。


2.高度为k的二叉树,最多有2^k-1个节点。


3.假设叶子数目为n0,度为2的节点数目为n2,则有:n0= n2+1




1.二叉树的插入


#include <stdio.h>
#include <stdlib.h>
#include "drawtree.h"
// 二叉树数据节点
typedef struct node
{
  int data; // 数据域
  struct node *lchild;  //左子树指针
  struct node *rchild;  //右子树指针
}node;
//二叉树插入
node *bst_insert(node *root, int new_data);
// 前序遍历: 根节点 - 左子树 - 右子树
void pre_traval(node *root);
// 中序遍历:左子树 - 根节点 - 右子树
void mid_traval(node *root);
// 后序遍历:左子树 - 右子树 - 根节点
void lst_traval(node *root);
int main()
{
  // 1.初始化空二叉树
  node *root = NULL;
  // 插入数据
  root = bst_insert(root, 10);
  root = bst_insert(root, 5);
  root = bst_insert(root, 15);
  root = bst_insert(root, 3);
  root = bst_insert(root, 8);
  root = bst_insert(root, 7);
  root = bst_insert(root, 9);
  root = bst_insert(root, 20);
  root = bst_insert(root, 18);
  // 2.数据操作
  int cmd;
  while(1)
  {
    printf("Pls Input: ");
    scanf("%d", &cmd); while(getchar()!='\n');
    if(cmd != 0)  //二叉树插入
      root = bst_insert(root, cmd);
    else if(cmd == 0) // 遍历
    {
      printf("pre_traval: ");
      pre_traval(root); // 前序遍历
      printf("\n");
      printf("mid_traval: ");
      mid_traval(root); // 中序遍历
      printf("\n");
      printf("lst_traval: ");
      lst_traval(root); // 后序遍历
      printf("\n");
    }
    draw((_treenode *)root);
  }
  return 0;
}
// 前序遍历: 根节点-左子树-右子树
void pre_traval(node *root)
{
  if(root == NULL)
    return;
  printf("%d ", root->data);
  pre_traval(root->lchild);
  pre_traval(root->rchild);
}
// 中序遍历:左子树 - 根节点 - 右子树
void mid_traval(node *root)
{
  if(root == NULL)
    return;
  mid_traval(root->lchild);
  printf("%d ", root->data);
  mid_traval(root->rchild);
}
// 后序遍历:左子树 - 右子树 - 根节点
void lst_traval(node *root)
{
  if(root == NULL)
    return;
  lst_traval(root->lchild);
  lst_traval(root->rchild);
  printf("%d ", root->data);
}
//二叉树插入
node *bst_insert(node *root, int new_data)
{
  if(root == NULL)
  {
    // 如果当前根节点为NULL,说明找到了插入位置
    node *new = malloc(sizeof(node));
    new->data = new_data;
    new->lchild = NULL;
    new->rchild = NULL;
    return new;
  }
  else if(root->data > new_data)  // 如果新数据更小,往左子树插入
    root->lchild = bst_insert(root->lchild, new_data);
  else if(root->data < new_data)  // 如果新数据更大,往右子树插入
    root->rchild = bst_insert(root->rchild, new_data);
  else  // 如果相等,已存在,不作处理
    printf("已存在\n");
  return root;
}


2.二叉树查找


#include <stdio.h>
#include <stdlib.h>
#include "drawtree.h"
// 二叉树数据节点
typedef struct node
{
  int data; // 数据域
  struct node *lchild;  //左子树指针
  struct node *rchild;  //右子树指针
}node;
//二叉树插入
node *bst_insert(node *root, int new_data);
// 二叉树搜索
int bst_search(node *root, int find_data);
// 前序遍历: 根节点 - 左子树 - 右子树
void pre_traval(node *root);
// 中序遍历:左子树 - 根节点 - 右子树
void mid_traval(node *root);
// 后序遍历:左子树 - 右子树 - 根节点
void lst_traval(node *root);
int main()
{
  // 1.初始化空二叉树
  node *root = NULL;
  // 插入数据
  root = bst_insert(root, 10);
  root = bst_insert(root, 5);
  root = bst_insert(root, 15);
  root = bst_insert(root, 3);
  root = bst_insert(root, 8);
  root = bst_insert(root, 7);
  root = bst_insert(root, 9);
  root = bst_insert(root, 20);
  root = bst_insert(root, 18);
  // 2.数据操作
  int cmd;
  while(1)
  {
    printf("Pls Input find_data: ");
    scanf("%d", &cmd); while(getchar()!='\n');
    if(cmd != 0)  //二叉树搜索
    {
      if(bst_search(root, cmd) == 0)
        printf("找到了\n");
      else
        printf("无此数据\n");
    }
    else if(cmd == 0) // 遍历
    {
      printf("pre_traval: ");
      pre_traval(root); // 前序遍历
      printf("\n");
      printf("mid_traval: ");
      mid_traval(root); // 中序遍历
      printf("\n");
      printf("lst_traval: ");
      lst_traval(root); // 后序遍历
      printf("\n");
    }
    draw((_treenode *)root);
  }
  return 0;
}
// 二叉树搜索
int bst_search(node *root, int find_data)
{
  if(root == NULL)  // 无此数据
    return -1;
  printf("find\n");
  if(root->data == find_data) // 找到指定数据
    return 0;
  else if(find_data < root->data)
    return bst_search(root->lchild, find_data);
  else if(find_data > root->data)
    return bst_search(root->rchild, find_data);
}
// 前序遍历: 根节点-左子树-右子树
void pre_traval(node *root)
{
  if(root == NULL)
    return;
  printf("%d ", root->data);
  pre_traval(root->lchild);
  pre_traval(root->rchild);
}
// 中序遍历:左子树 - 根节点 - 右子树
void mid_traval(node *root)
{
  if(root == NULL)
    return;
  mid_traval(root->lchild);
  printf("%d ", root->data);
  mid_traval(root->rchild);
}
// 后序遍历:左子树 - 右子树 - 根节点
void lst_traval(node *root)
{
  if(root == NULL)
    return;
  lst_traval(root->lchild);
  lst_traval(root->rchild);
  printf("%d ", root->data);
}
//二叉树插入
node *bst_insert(node *root, int new_data)
{
  if(root == NULL)
  {
    // 如果当前根节点为NULL,说明找到了插入位置
    node *new = malloc(sizeof(node));
    new->data = new_data;
    new->lchild = NULL;
    new->rchild = NULL;
    return new;
  }
  else if(root->data > new_data)  // 如果新数据更小,往左子树插入
    root->lchild = bst_insert(root->lchild, new_data);
  else if(root->data < new_data)  // 如果新数据更大,往右子树插入
    root->rchild = bst_insert(root->rchild, new_data);
  else  // 如果相等,已存在,不作处理
    printf("已存在\n");
  return root;
}


drawtree.h


///
//
//  Copyright(C), 2013-2017, GEC Tech. Co., Ltd.
//
//  文件: lab/tree/headers/drawtree.h
//  日期: 2017-9
//  描述: 使用C语言写一页webpage展示二叉树
//
//  作者: Vincent Lin (林世霖)   微信公众号:秘籍酷
//  技术微店: http://weidian.com/?userid=260920190
//  技术交流: 260492823(QQ群)
//
///
#ifndef _DRAWTREE_H_
#define _DRAWTREE_H_
/* ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 公共头文件 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ */
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <unistd.h>
#include <string.h>
#include <strings.h>
#include <time.h>
#include <errno.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/shm.h>
#include <sys/msg.h>
#include <semaphore.h>
#include <fcntl.h>
#include <pthread.h>
/* ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ 公共头文件 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ */
#define MAX(a, b) ({ \
    typeof(a) _a = a; \
    typeof(b) _b = b; \
    (void)(&_a == &_b);\
    _a > _b? _a : _b; \
    })
/* ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 默认二叉树节点 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ */
typedef struct _tree_node
{
  int data;
  struct _tree_node *lchild;
  struct _tree_node *rchild;
#ifdef AVL
  int height;
#endif
#ifdef RB
  struct _tree_node *parent;
  int color;
#endif
}_treenode, *_linktree;
/* ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ 默认二叉树节点 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ */
/* ↓↓↓↓↓ 用户指定二叉树节点 ↓↓↓↓↓ */
#ifndef NODE
#define NODE _treenode
#endif
/* ↑↑↑↑↑ 用户指定二叉树节点 ↑↑↑↑↑ */
/* ↓↓↓↓↓↓↓↓↓↓↓↓↓ 画网页相关算法代码 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ */
#ifndef QUEUE_NODE_DATATYPE
#define QUEUE_NODE_DATATYPE NODE *
#endif
typedef QUEUE_NODE_DATATYPE qn_datatype;
struct _queue_node
{
  qn_datatype data;
  struct _queue_node *next;
};
typedef struct
{
  struct _queue_node *front;
  struct _queue_node *rear;
#ifdef QUEUE_SIZE
  int size;
#endif
}_queuenode, *_linkqueue;
static _linkqueue init_queue(void)
{
    _linkqueue q = (_linkqueue)malloc(sizeof(_queuenode));
  q->front = q->rear =
    (struct _queue_node *)malloc(sizeof(struct _queue_node));
  q->rear->next = NULL;
  return q;
}
static bool is_empty_q(_linkqueue q)
{
  return (q->front == q->rear);
}
/* ↓↓↓↓↓↓↓↓↓↓↓↓↓ 画网页相关算法代码 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ */
static bool out_queue(_linkqueue q, qn_datatype *pdata)
{
  if(is_empty_q(q))
    return false;
  struct _queue_node *p = q->front;
  q->front = q->front->next;
  free(p);
  *pdata = q->front->data;
  return true;
}
static bool en_queue(_linkqueue q, qn_datatype data)
{
  struct _queue_node *pnew;
  pnew = (struct _queue_node *)malloc(sizeof(struct _queue_node));
  if(pnew == NULL)
    return false;
  pnew->data = data;
  pnew->next = NULL;
  q->rear->next = pnew;
  q->rear = pnew;
  return true;
}
#ifdef QUEUE_SIZE
int queue_size(_linkqueue *q)
{
  return q->size;
}
#endif
/* ↓↓↓↓↓↓↓↓↓↓↓↓↓ 画网页相关算法代码 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ */
static inline void pre_travel(NODE *root, void (*handler)(NODE *))
{
  if(root == NULL)
    return;
  handler(root);
  pre_travel(root->lchild, handler);
  pre_travel(root->rchild, handler);
}
static inline void mid_travel(NODE *root, void (*handler)(NODE *))
{
  if(root == NULL)
    return;
  mid_travel(root->lchild, handler);
  handler(root);
  mid_travel(root->rchild, handler);
}
static inline void post_travel(NODE *root, void (*handler)(NODE *))
{
  if(root == NULL)
    return;
  post_travel(root->lchild, handler);
  post_travel(root->rchild, handler);
  handler(root);
}
/* ↓↓↓↓↓↓↓↓↓↓↓↓↓ 画网页相关算法代码 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ */
static inline void level_travel(NODE *root, void (*handler)(NODE *))
{
  if(root == NULL)
    return;
    _linkqueue q;
  q = init_queue();
  en_queue(q, root);
    NODE *tmp;
  while(1)
  {
    if(!out_queue(q, &tmp))
      break;
    handler(tmp);
    if(tmp->lchild != NULL)
      en_queue(q, tmp->lchild);
    if(tmp->rchild != NULL)
      en_queue(q, tmp->rchild);
  }
}
/* ↓↓↓↓↓↓↓↓↓↓↓↓↓ 画网页相关算法代码 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ */
static char page_begin[] = "<html><head><title>tree map"
                           "</title></head><body>"
         "<table border=0 cellspacing"
                           "=0 cellpadding=0>";
static char line_begin[] = "<tr>";
static char line_end  [] = "</tr>";
static char space     [] = "<td>&nbsp;</td>";
static char underline [] = "<td style=\"border-bottom:"
         "1px solid #58CB64\">&nbsp;"
                           "</td>";
#ifdef RB
static char data_begin_red[] = "<td bgcolor=\"#FF0000\";style="
             "\"border:1px sol"
                               "id #58CB64;background-colo"
                               "r:#DDF1D8;PADDING:2px;\" t"
                               "itle=\"level: 1\">";
static char data_begin_blk[] = "<td bgcolor=\"#000000\";style="
             "\"border:1px sol"
                               "id #58CB64;background-colo"
                               "r:#DDF1D8;PADDING:2px;\" t"
                               "itle=\"level: 1\"><font color"
        "=\"#FFFFFF\">";
static char data_end_red[] = "</td>";
static char data_end_blk[] = "</font></td>";
#else
static char data_begin[] = "<td style=\"border:1px sol"
                           "id #58CB64;background-colo"
                           "r:#DDF1D8;PADDING:2px;\" t"
                           "itle=\"level: 1\">";
static char data_end  [] = "</td>";
#endif
static char page_end  [] = "</table></body></html>";
#define MAX_NODES_NUMBER 100
#define FILENAME 32
static int central_order[MAX_NODES_NUMBER];
static void putunderline(int fd, int num)
{
  int i;
  for(i=0; i<num; i++)
  {
    write(fd, underline, strlen(underline));
  }
}
static void putspace(int fd, int num)
{
  int i;
  for(i=0; i<num; i++)
  {
    write(fd, space, strlen(space));
  }
}
/* ↓↓↓↓↓↓↓↓↓↓↓↓↓ 画网页相关算法代码 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ */
#ifdef RB
static void putdata(int fd, NODE * p)
{
  char s[50];
  bzero(s, 50);
  snprintf(s, 50, "%d", p->data);
  switch(p->color)
  {
  case RED:
    write(fd, data_begin_red, strlen(data_begin_red));
    write(fd, s, strlen(s));
    write(fd, data_end_red, strlen(data_end_red));
    break;
  case BLACK:
    write(fd, data_begin_blk, strlen(data_begin_blk));
    write(fd, s, strlen(s));
    write(fd, data_end_blk, strlen(data_end_blk));
  }
}
#else
static void putdata(int fd, int data)
{
  char s[50];
  bzero(s, 50);
  snprintf(s, 50, "%d", data);
  write(fd, data_begin, strlen(data_begin));
  write(fd, s, strlen(s));
  write(fd, data_end, strlen(data_end));
}
#endif
static int Index = 0;
static void create_index(NODE * root)
{
  if(Index >= MAX_NODES_NUMBER-1)
    return;
  central_order[Index++] = root->data;
}
static int get_index(int data)
{
  int i;
  for(i=0; i<100; i++)
  {
    if(central_order[i] == data)
      return i;
  }
  return -1;
}
/* ↓↓↓↓↓↓↓↓↓↓↓↓↓ 画网页相关算法代码 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ */
static void data_leftside(int fd, NODE * root, int spaces)
{
  if(root == NULL)
    return;
  int s_line=0;
  if(root->lchild != NULL)
  {
    s_line = get_index(root->data)-
       get_index(root->lchild->data)-1;
  }
  putspace(fd, spaces-s_line);
  putunderline(fd, s_line);
}
static int data_rightside(int fd, NODE * root)
{
  if(root == NULL)
    return 0;
  int s_line=0;
  if(root->rchild != NULL)
  {
    s_line = get_index(root->rchild->data)-
       get_index(root->data)-1;
  }
  putunderline(fd, s_line);
  return s_line;
}
static void start_page(int fd)
{
  write(fd, page_begin, strlen(page_begin));
}
/* ↓↓↓↓↓↓↓↓↓↓↓↓↓ 画网页相关算法代码 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ */
static void end_page(int fd)
{
  write(fd, page_end, strlen(page_end));
}
static void draw(NODE * root)
{
  if(root == NULL)
    return;
  time_t t;
  time(&t);
  static char filename[FILENAME];
  bzero(filename, FILENAME);
  snprintf(filename, FILENAME, "1.html");
  int fd = open(filename, O_CREAT | O_TRUNC | O_RDWR, 0644);
  if(fd == -1)
  {
    perror("open() failed");
    exit(1);
  }
  Index = 0;
  mid_travel(root, create_index);
    _linkqueue q = init_queue();
  NODE * tmp = root;
  int ndata = 1;
  start_page(fd);
  while(1)
  {
    write(fd, line_begin, strlen(line_begin));
    int i, n = 0;
    int nextline = 0;
    for(i=0; i<ndata; i++)
    {
      int index = get_index(tmp->data);
      data_leftside(fd, tmp, index-n);
      #ifdef RB
      putdata(fd, tmp);
      #else
      putdata(fd, tmp->data);
      #endif
      int rightline = data_rightside(fd, tmp);
      if(tmp->lchild != NULL)
      {
        nextline++;
        en_queue(q, tmp->lchild);
      }
      if(tmp->rchild != NULL)
      {
        nextline++;
        en_queue(q, tmp->rchild);
      }
      if(!out_queue(q, &tmp))
        return;
      n = index + rightline;
      n++;
    }
    write(fd, line_end, strlen(line_end));
    ndata = nextline;
  }
  end_page(fd);
  close(fd);
}
#endif



冒泡排序


#include <stdio.h>
void show_array(int len, int *a)
{
  int i;
  for(i=0; i<len; i++)
    printf("%d ", a[i]);
  printf("\n");
}
void bubble_sort(int len, int *a)
{
  // 遍历次数:len-1
  int i, j;
  int temp;
  int flag;
  for(i=0; i<len-1; i++)
  {
    flag=0;
    // 两两对比,左数大于右数则交换(次数: len-i-1)
    for(j=0; j<len-i-1; j++)
    {
      if(a[j] > a[j+1])
      {
        temp = a[j];
        a[j] = a[j+1];
        a[j+1] = temp;
        flag = 1;
      }
    }
    printf("%d: ", i+1);
    show_array(5, a);
    // 如果没有发生数据交换,则说明已经是有序列
    if(flag == 0)
      break;
  }
}
int main()
{
  int arr[5] = {5, 4, 3, 2, 1};
  show_array(5, arr);
  bubble_sort(5, arr);
  show_array(5, arr);
  return 0;
}


插入排序-额外空间


#include <stdio.h>
void show_array(int len, int *a)
{
  int i;
  for(i=0; i<len; i++)
    printf("%d ", a[i]);
  printf("\n");
}
void insertion_sort(int len, int *a)
{
  // 1.定义有序列数组,将第1个数据放入
  int b[len];
  b[0] = a[0];
  // 2.将原始数据的每个数据与有序列中数据对比,找到插入位置pos
  int i;    // 原始数据操作下标
  int j;    // 向后移动变量
  int pos;  // 有序列对比下标
  for(i=1; i<len; i++)
  {
    // 2.1 在有序列中循环找到插入位置pos后,break结束
    for(pos=0; pos<i; pos++)  
    {
      if(a[i] < b[pos])
        break;
    }
    // 2.2 将pos后续数据向后移动(从最后开始)
    for(j=i; j>pos; j--)
      b[j] = b[j-1];
    // 2.3 数据放入有序列中pos位置
    b[pos] = a[i];
    // 把中间过程的数据打印出来
    printf("%d: ", i);
    show_array(5, b);
  }
  // 3.将有序列数据覆盖无序列
  for(i=0; i<len; i++)
    a[i] = b[i];
}
int main()
{
  int arr[5] = {2, 5, 3, 1, 4};
  show_array(5, arr);
  insertion_sort(5, arr);
  show_array(5, arr);
  return 0;
}


插入排序


#include <stdio.h>
void show_array(int len, int *a)
{
  int i;
  for(i=0; i<len; i++)
    printf("%d ", a[i]);
  printf("\n");
}
void insertion_sort(int len, int *a)
{
  int swap; //无序列数下标
  int pos;
  int i;
  // 逐个循环取得无序数
  for(swap=1; swap<len; swap++)
  {
    // 1.暂存当前无序数
    int temp = a[swap];
    // 2.该无序数与有序列每个数据对比,找到插入位置pos
    for(pos=0; pos<swap; pos++)
    {
      if(temp < a[pos])
        break;
    }
    // 3.将pos后续数据逐个向后移动(从后开始)
    int i;
    for(i=swap; i>pos; i--)
      a[i] = a[i-1];
    // 4.将该无序数写入有序列
    a[pos] = temp;
  }
}
int main()
{
  int arr[5] = {2, 5, 3, 1, 4};
  show_array(5, arr);
  // 不使用额外内存
  insertion_sort(5, arr);
  show_array(5, arr);
  return 0;
}


目录
打赏
0
0
0
0
231
分享
相关文章
企业上网监控系统中红黑树数据结构的 Python 算法实现与应用研究
企业上网监控系统需高效处理海量数据,传统数据结构存在性能瓶颈。红黑树通过自平衡机制,确保查找、插入、删除操作的时间复杂度稳定在 O(log n),适用于网络记录存储、设备信息维护及安全事件排序等场景。本文分析红黑树的理论基础、应用场景及 Python 实现,并探讨其在企业监控系统中的实践价值,提升系统性能与稳定性。
46 1
基于跳表数据结构的企业局域网监控异常连接实时检测 C++ 算法研究
跳表(Skip List)是一种基于概率的数据结构,适用于企业局域网监控中海量连接记录的高效处理。其通过多层索引机制实现快速查找、插入和删除操作,时间复杂度为 $O(\log n)$,优于链表和平衡树。跳表在异常连接识别、黑名单管理和历史记录溯源等场景中表现出色,具备实现简单、支持范围查询等优势,是企业网络监控中动态数据管理的理想选择。
51 0
|
5月前
|
算法系列之数据结构-二叉树
树是一种重要的非线性数据结构,广泛应用于各种算法和应用中。本文介绍了树的基本概念、常见类型(如二叉树、满二叉树、完全二叉树、平衡二叉树、B树等)及其在Java中的实现。通过递归方法实现了二叉树的前序、中序、后序和层次遍历,并展示了具体的代码示例和运行结果。掌握树结构有助于提高编程能力,优化算法设计。
147 10
 算法系列之数据结构-二叉树
|
5月前
|
算法系列之数据结构-Huffman树
Huffman树(哈夫曼树)又称最优二叉树,是一种带权路径长度最短的二叉树,常用于信息传输、数据压缩等方面。它的构造基于字符出现的频率,通过将频率较低的字符组合在一起,最终形成一棵树。在Huffman树中,每个叶节点代表一个字符,而每个字符的编码则是从根节点到叶节点的路径所对应的二进制序列。
140 3
 算法系列之数据结构-Huffman树
|
5月前
|
算法系列之数据结构-二叉搜索树
二叉查找树(Binary Search Tree,简称BST)是一种常用的数据结构,它能够高效地进行查找、插入和删除操作。二叉查找树的特点是,对于树中的每个节点,其左子树中的所有节点都小于该节点,而右子树中的所有节点都大于该节点。
142 22
C 408—《数据结构》算法题基础篇—链表(下)
408考研——《数据结构》算法题基础篇之链表(下)。
173 30
C 408—《数据结构》算法题基础篇—链表(上)
408考研——《数据结构》算法题基础篇之链表(上)。
252 25
C 408—《数据结构》算法题基础篇—数组(通俗易懂)
408考研——《数据结构》算法题基础篇之数组。(408算法题的入门)
240 23
|
7月前
|
【C++数据结构——树】二叉树的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现二叉树的基本运算。​ 相关知识 创建二叉树 销毁二叉树 查找结点 求二叉树的高度 输出二叉树 //二叉树节点结构体定义 structTreeNode{ intval; TreeNode*left; TreeNode*right; TreeNode(intx):val(x),left(NULL),right(NULL){} }; 创建二叉树 //创建二叉树函数(简单示例,手动构建) TreeNode*create
170 12
|
7月前
|
C++
【C++数据结构——树】二叉树的性质(头歌实践教学平台习题)【合集】
本文档介绍了如何根据二叉树的括号表示串创建二叉树,并计算其结点个数、叶子结点个数、某结点的层次和二叉树的宽度。主要内容包括: 1. **定义二叉树节点结构体**:定义了包含节点值、左子节点指针和右子节点指针的结构体。 2. **实现构建二叉树的函数**:通过解析括号表示串,递归地构建二叉树的各个节点及其子树。 3. **使用示例**:展示了如何调用 `buildTree` 函数构建二叉树并进行简单验证。 4. **计算二叉树属性**: - 计算二叉树节点个数。 - 计算二叉树叶子节点个数。 - 计算某节点的层次。 - 计算二叉树的宽度。 最后,提供了测试说明及通关代
157 10
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问