二叉树(链式结构存储)

简介: 二叉树(链式结构存储)

1.二叉树的前,中,后序

前序:按照访问顺序依次访问根,左子树,右子树

中序:按照访问顺序依次访问左子树,根,右子树

后序:按照访问顺序依次访问左子树,右子树,根

层序:一层一层的挨着遍历;

以上图为例:(N 表示NULL)

前序:1     2     4     N      N     5     N      N     3      6      N     N    7    N     N

中序:N    4     N     2      N      5     N     1      N      6     N     3     N    7     N

后序:N    N     4     N     N      5     2      N      N     6      N     N    7     3     1

层序:1     2     3     4      5      6      7

2.二叉树的前,中,后序遍历代码实现(递归)

前序遍历代码:

void PrevPrintf(BTNode* root)
{
  if (root == NULL)
  {
    printf("N ");
    return;
  }
  printf("%d ",root->val);
  PrevPrintf(root->left);
  PrevPrintf(root->right);
}

中序遍历代码:

void InPrintf(BTNode* root)
{
  if (root == NULL)
  {
    printf("N ");
    return;
  }
  InPrintf(root->left);
  printf("%d ", root->val);
  InPrintf(root->right);
}

后序遍历代码:

void PostPrintf(BTNode* root)
{
  if (root == NULL)
  {
    printf("N ");
    return;
  }
  PostPrintf(root->left);
  PostPrintf(root->right);
  printf("%d ", root->val);
}

2.实现几个函数

1.求树中结点个数

int    TreeSize(BTNode*  root);

代码思想:

要求树的结点,可以先求左右子树结点相加,求左右子树结点又可以先求左右子树的左右子树的结点相加;

实现代码:
//结点的个数
int TreeSize(BTNode* root)
{
  if (root == NULL)
    return 0;
  return TreeSize(root->left) + TreeSize(root->right) + 1;
}

2.求树中叶子结点的个数

int    TreeLeafSize(BTNode*  root);

代码思想:

叶子结点的特点是:左右子树都为NULL;

当根结点为NULL时,直接返回0;

当左右子树都为NULL时,返回1,

不满足上面条件就继续递归当前结点的左右子树;

实现代码:
// 叶子节点个数
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);
}

3.求树中第k层结点的个数

int    TreeKLevel(BTNode*  root);

代码思想:

对于第一层来说时求第k层的结点个数,但是对于第二层来说是求第k-1层的节点个数,对于第二层来说求第k-层的结点数目,以此类推,对于k-1层来说是求第二层结点数;

实现代码:
//第k层的结点
int TreeKLevel(BTNode* root, int k)
{
  assert(k > 0);
  if (root == NULL)
    return 0;
  if (k == 1)
    return 1;
  return TreeKLevel(root->left, k - 1) + TreeKLevel(root->right, k - 1);
}

4.查找树中的值

BTNode*  TreeFind(BTNode* root)

代码思想:

先与根比较,不是根再到左子树去找,左子树没有找到再到右子树中找

代码实现:
BTNode* FindBinaryTreeX(BTNode* root, int x)
{
  if (root == NULL)
    return;
  if (root->val == x)
    return root;
  BTNode* ret = NULL;
  ret = FindBinaryTreeX(root->left, x);
//如果ret不为空,就说明找到了,直接返回,不用到另一边去找
  if (ret)
    return ret;
  ret = FindBinaryTreeX(root->right, x);
  if (ret)
    return ret;
//找完了,没找到,返回空
  return NULL;
}

5.二叉树的层序遍历

void  BinaryTreeLevelOrder(BTNode* root)

代码思想:

利用队列先进先出的特点,先将根结点入进去,取出队列最前面的数,进行打印,再将根结点Pop出队列时,再将该结点的左右子树入进去,如图解:

 

代码实现:
void BinaryTreeLevelOrder(BTNode* root)
{
  Qu1 p;
//队列的初始化
  QueueInit(&p);
//如果根结点不为空,将根入队列
  if (root)
    QueuePush(&p, root);
  while (!QueueEmpty(&p))
  {
    BTNode* front = QueueFront(&p);
    QueuePop(&p);
    printf("%d ",front->val);
    if(front->left!=NULL)
      QueuePush(&p, front->left);
    if (front->right!= NULL)
      QueuePush(&p, front->right);
  }
//队列的销毁
  QueueDestory(&p);
}

6.二叉树的销毁

void BinaryTreeDestory(BTNode** root)

代码实现
// 二叉树销毁
void BinaryTreeDestory(BTNode* root)
{
  if (root == NULL)
    return;
  BinaryTreeDestory(root->left);
  BinaryTreeDestory(root->right);
  free(root);
  //这里root是形参,对它改变不会改变实参;
  root = NULL;
}
目录
相关文章
|
6月前
数据结构——二叉树的链式结构
数据结构——二叉树的链式结构
68 0
|
5月前
|
存储 算法
【数据结构和算法】--- 二叉树(4)--二叉树链式结构的实现(2)
【数据结构和算法】--- 二叉树(4)--二叉树链式结构的实现(2)
38 0
|
1月前
|
机器学习/深度学习
二叉树的链式结构
二叉树的链式结构
14 0
|
6月前
|
索引
[数据结构]——二叉树链式结构的实现
[数据结构]——二叉树链式结构的实现
|
5月前
|
算法
【数据结构和算法】--- 二叉树(3)--二叉树链式结构的实现(1)
【数据结构和算法】--- 二叉树(3)--二叉树链式结构的实现(1)
33 0
|
6月前
【数据结构】二叉树的链式结构的实现 -- 详解
【数据结构】二叉树的链式结构的实现 -- 详解
【数据结构】二叉树 链式结构的相关问题
【数据结构】二叉树 链式结构的相关问题
|
6月前
【数据结构】二叉树之链式结构
【数据结构】二叉树之链式结构
|
6月前
二叉树链式结构
二叉树链式结构
|
机器学习/深度学习 存储 算法
【数据结构】二叉树链式结构的实现(三)
【数据结构】二叉树链式结构的实现(三)
105 0