二叉树(详解)下

简介: 二叉树(详解)

4.2.2层序遍历


层序遍历:假设二叉树的根节点所在的层数为1,层序遍历便是从二叉树的根节点出发,先访问第一层的根节点,然后依次从左向右访问第二层上的节点,其次是第三层上的节点,以此类推,从上到下,从左到右逐层访问树的节点的过程就是层序遍历。


45ba21c9cc7623e6dce1eec474f4fce7_1623727527c74eac9d574b7e550ec808.png


层序遍历采取队列的思想:先入先出


例如根节点先入队列,然后出队列时,通过左右指针将左右子树的根节点带入队列,重复此操作,直到将二叉树完全遍历。


11e3b066bcb4ba8736e3ebd2542d8d2e_bf71e91aead242f5a2eaae52a332533e.png


代码实现


void Levelorder(BTnode* root)
{
  QE q;
  QEinit(&q, root);
  if (root)
  {
  QEpush(&q, root);
  }
  while (!QEempty(&q))
  {
  BTnode* front = QEfront(&q);
  QEpop(&q);
  printf("%d ", front->data);
  //下一层
  if (front->left)
  {
    QEpush(&q, front->left);
  }
  if (front->right)
  {
    QEpush(&q, front->right);
  }
  }
  printf("\n");
  QEdestory(&q);
}


471e9e619286be8413c63bb09bc6a73f_c1548c82d2e5475d9c4dc291e40536d2.png


4.3节点个数以及高度


计算第k层叶子节点的总数


//计算第k层节点个数
int Treeksize(BTnode* root,int k)
{
  if (root == NULL)
  {
  return 0;
  }
  if (k == 1)
  {
  return 1;
  }
    //转化成计算第(k-1)层节点的个数
  return Treeksize(root->left, k - 1) + Treeksize(root->right, k - 1);
}


7fce783696539b45a6f591756b056ad8_fc3c02638ab24a28b583bf4af5c8937b.png

270e06d028ad2d615597eb6df177b9b6_2e59c72bd789469ea25c725060857e82.png


计算总的节点个数


int Treesize(BTnode* root)
{
  if (root == NULL)
  {
  return 0;
  }
  return Treesize(root->left) + Treesize(root->right) + 1;
}


8a7bbd321509abc8a525e2a1961fe7ce_24a84e7fcf8545ddb2973dcc7659283a.png

c6369bf07f5101426423c517120a0570_68e9ad6769ce4fc48fccc216b0a3478a.png


计算叶子节点总数


int Treeleafsize(BTnode* root)
{
  if (root == NULL)
  {
  return 0;
  }
  if (root->left == NULL && root->right == NULL)
  {
  return 1;
  }
  return Treeleafsize(root->left) + Treeleafsize(root->right);
}

5a339c3e5ff743b1484f29bc70219954_9638da40b29a4eeab3fb0d4539a2733f.png

e179e88ca9c5a927caa4caac3e06919c_88d0214632e5493e835ea3b67cf1db07.png


高度


后序思想

计算左子树,右子树高度

父亲高度=较高的子树+1


int Treeheight(BTnode* root)
{
  if (root == NULL)
  {
  return 0;
  }
  int lret = Treeheight(root->left);
  int rret = Treeheight(root->right);
  return lret > rret ? lret + 1 : rret + 1;
}


55e3dab6b4c346c04de257b3206c8b20_17bf5ef1f9c444d5b534e4955fc05da8.png


求节点所在位置


//返回x所在的节点
BTnode* Treefind(BTnode* root, int x)
{
  if (root == NULL)
  {
  return NULL;
  }
  if (root->data == x)
  {
  return root;
  }
  //找左子树
  BTnode*lret = Treefind(root->left, x);
  if (lret)
  {
  return lret;
  }
  //左子树没有找到,找右子树
  BTnode* rret = Treefind(root->right, x);
  if (rret)
  {
  return rret;
  }
  return NULL;
}


4.4二叉树的创建和销毁


通过前序遍历数组

“1 2 3 NULL NULL 4 NULL NULL 5 NULL 6 NULL NULL” 构建二叉树


BTnode* Binarytreecreate(BTdatatype* a, int* pi)
{
  if (NULL == a[*pi])
  {
  (*pi)++;
  return NULL;
  }
  BTnode* root = (BTnode*)malloc(sizeof(BTnode));
  if (root == NULL)
  {
  perror("malloc fail");
  return NULL;
  }
  root->data = a[*pi];
  (*pi)++;
  root->left = Binarytreecreate(a, pi);
  root->right = Binarytreecreate(a, pi);
  return root;
}


中序遍历二叉树并打印


f78bd0d0e34a2e8d3dddd4300616aa13_3af1c4b115f64a31a0341fb1b6fb56ce.png


二叉树的销毁


void Binarytreedestory(BTnode* root)
{
  if (root == NULL)
  {
  return;
  }
  Binarytreedestory(root->left);
  Binarytreedestory(root->right);
  free(root);
}


57d15fc920537a99a8dfce1474c48d8d_d1842885019f41dfaa52034ec149879d.png


判断二叉树是否为完全二叉树


int Binarytreecomplete(BTnode* root)
{
  QE q;
  QEinit(&q);
  if (root)
  {
  QEpush(&q, root);
  }
  while (!QEempty(&q))
  {
  BTnode* front = QEfront(&q);
  QEpop(&q);
  if (front == NULL)
  {
    break;
  }
  QEpush(&q, front->left);
  QEpush(&q, front->right);
  }
  //遇到NULL之后,从上面循环跳出
  //如果后面全是空,则为完全二叉树
  //如果后面存在非空,则不为完全二叉树
  while (!QEempty(&q))
  {
  BTnode* front = QEfront(&q);
  QEpop(&q);
  if (front != NULL)
  {
    return false;
  }
  }
  QEdestory(&q);
    //如果整个程序走完,则说明是完全二叉树,返回true
  return true;
}


c24fc31e5edb01071456a5845e25a09c_b1cc4ff1f4a64682853d734548df2861.png

c24fc31e5edb01071456a5845e25a09c_b1cc4ff1f4a64682853d734548df2861.png


返回结果

d042d12a637b92d93a44954a630bd33c_162aaece37ec43fe8410f36ad0b0f994.png


目录
相关文章
|
7月前
|
机器学习/深度学习 存储 算法
深入理解【二叉树】
深入理解【二叉树】
49 0
|
7月前
|
C语言
【二叉树】的实现
【二叉树】的实现
20 0
|
15小时前
|
存储 数据库管理
【二叉树】
【二叉树】
33 0
|
15小时前
|
存储 Java C++
二叉树的实现(上)
二叉树的实现
45 0
|
5月前
|
存储
浅谈二叉树
浅谈二叉树
31 1
|
7月前
|
存储
二叉树讲解
二叉树讲解
48 0
|
9月前
|
存储
二叉树_详解
二叉树的详解
|
9月前
|
存储
【二叉树】(一)
【二叉树】(一)
34 0
|
9月前
|
Java
简单介绍二叉树
简单介绍二叉树
|
11月前
|
存储 分布式数据库
二叉树的理解
二叉树的理解
62 0