初阶数据结构 遍历二叉树问题 (一)

简介: 初阶数据结构 遍历二叉树问题 (一)

一. 链式二叉树的实现


1. 结构体代码


typedef int BTdate;
typedef struct BinaryTree
{
  struct BinaryTree* left;
  struct BinaryTree* right;
  BTdate date;
}BT;


大概的图形是这样子




2. 增删查改

我们这里要明确的一点的 二叉树的增删查改是没有意义的


为什么呢?


我们来看下图



这颗二叉树的排列没有任何的规律 并且我们要插入也不知道往哪里插入


所以说 单纯的对二叉树curd操作是没有任何意义的


那么我们学习二叉树的意义在哪里呢?


这里就要引出我们后面的搜索二叉树 平衡二叉树 以及红黑二叉树


这些知识我们都会在后面的博客中学习到


二. 二叉树的遍历


1. 二叉树遍历的三种方式


前序遍历


前序遍历的大概解释: 先遍历根 再遍历左数 再遍历右数


还是一样 我们先来看图



ff351e4813b9479cab80c040627ddc5a.png

如果我们要使用前面序遍历这个图


那么打印的顺序会是什么呢?


画图来看看


8a3618e9962b4f26b15ff0a0f82d4051.png


首先应该是先打印A


之后来看A的左子树 将根转换到B 打印B


之后来看B的左子树 打印D


之后看B的右子树 打印E


之后看E的右子树 打印H


之后看A的右子树 打印C


之后看C的左边子树 打印F


之后看C的右子树 打印G


中序遍历


中序遍历的大概解释 先遍历左子树 再遍历根 再遍历右子树


这里大家可以试着自己做一下


顺序肯定是


D B E H A FC G


这里其实只要将这个二叉树投影平面上就好


后序遍历


后序遍历的大概解释 先遍历左子树 再遍历根 再遍历右子树


这个大家可以自己试着做一做 这里就不过多赘述了


2. 二叉树遍历的递归实现


我们首先先自己实现如图的一个二叉树出来

ff351e4813b9479cab80c040627ddc5a.png



要想自己实现一个二叉树其实也很简单


我们先设计一个BuyBTnode函数 用来创建二叉树的节点


之后给每一个节点赋上值 左右节点各自指向如图的位置就可以


代码表示如下


BTnode* BuyBTnode(BTdate x)
{
  BTnode* newnode = (BTnode*)malloc(sizeof(BTnode));
  // assert
  assert(newnode);
  // 赋值 
  newnode->left = newnode->right = NULL;
  newnode->date = x;
  //return
  return newnode;
}
void CreatNewBT()
{
  // 创建
  BTnode* nodeA = BuyBTnode('A');
  BTnode* nodeB = BuyBTnode('B');
  BTnode* nodeC = BuyBTnode('C');
  BTnode * nodeD = BuyBTnode('D');
  BTnode * nodeE = BuyBTnode('E');
  BTnode * nodeF = BuyBTnode('F');
  BTnode * nodeG = BuyBTnode('G');
  BTnode * nodeH = BuyBTnode('H');
  // 连接
  nodeA->left =  nodeB;
  nodeA->right = nodeC;
  nodeB->left = nodeD;
  nodeB->right = nodeE;
  nodeE->right = nodeH;
  nodeC->left = nodeF;
  nodeC->right = nodeG;
}


接下来我们就开始写递归函数了


代码表示如下


BTnode* CreatNewBT()
{
  // 创建
  BTnode* nodeA = BuyBTnode('A');
  BTnode* nodeB = BuyBTnode('B');
  BTnode* nodeC = BuyBTnode('C');
  BTnode * nodeD = BuyBTnode('D');
  BTnode * nodeE = BuyBTnode('E');
  BTnode * nodeF = BuyBTnode('F');
  BTnode * nodeG = BuyBTnode('G');
  BTnode * nodeH = BuyBTnode('H');
  // 连接
  nodeA->left =  nodeB;
  nodeA->right = nodeC;
  nodeB->left = nodeD;
  nodeB->right = nodeE;
  nodeE->right = nodeH;
  nodeC->left = nodeF;
  nodeC->right = nodeG;
  // return
  return nodeA;
}
void preorder(BTnode* root)
{
  // assert
  //assert(root);
  //main
  if (root==NULL)
  {
    printf("NULL ");
    return;
  }
  printf("%c ", root->date);
  preorder(root->left);
  preorder(root->right);
  // 这里大概解释下这个递归函数
  // 我们将preorder的功能定义为遍历整个树 
  // 如果说遍历为空的话 那就直接返回 
  // 如果说不为空的话 那就打印这个根 然后遍历它的左树 遍历完左树 遍历右树
}


我们可以发现 这里能够可以实现先序打印

dbeb3b0e28e24b449b94c87db11db51a.png


那么我们试试看中序打印


(大家想想看 需要改变哪一行代码就可以实现中序打印)


void preorder(BTnode* root)
{
  // assert
  //assert(root);
  //main
  if (root==NULL)
  {
    printf("NULL ");
    return;
  }
  printf("%c ", root->date);
  preorder(root->left);
  preorder(root->right);
  // 这里大概解释下这个递归函数
  // 我们将preorder的功能定义为遍历整个树 
  // 如果说遍历为空的话 那就直接返回 
  // 如果说不为空的话 那就打印这个根 然后遍历它的左树 遍历完左树 遍历右树
}


这个就需要我们理解每一行的功能


这一行代码的功能是实现遍历左子树


preorder(root->left);
• 1


这一行代码的功能是遍历右子树


preorder(root->right);


那么想要先遍历左子树 然后遍历根 然后遍历右子树 需要什么样的顺序呢?


没错 这样子的三行代码就可以了


preorder(root->left);
  printf("%c ", root->date);
  preorder(root->right);


那么后序打印呢?


  preorder(root->left);
  preorder(root->right);
  printf("%c ", root->date);


很简单是吧


3 二叉树求节点个数


这里有两种实现方式


第一种我们可以传一个count的地址进去 然后再遍历内部结构 如果不是空值就加一

思路大概是这样子


我们来看看函数实现


void BTcount(BTnode* root, int* p)
{
  if (root == NULL)
  {
    return;
  }
  (*p)++;
  BTcount(root->left,p);
  BTcount(root->right,p);
}

38394e622de343648f6282e166bf08e7.png


这里还有另一种解法


我们使用递归实现


代码表示如下


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


我们发现也是可以完美实现

3add6ff2af2642cdaedd34df88c669c0.png


以上就是本篇博客的全部内容啦 由于博主才疏学浅 所以难免会出现纰漏 希望大佬们看到错误之后能够


不吝赐教 在评论区或者私信指正 博主一定及时修正


那么大家下期再见咯

相关文章
|
6天前
|
存储 算法 Java
算法系列之数据结构-二叉树
树是一种重要的非线性数据结构,广泛应用于各种算法和应用中。本文介绍了树的基本概念、常见类型(如二叉树、满二叉树、完全二叉树、平衡二叉树、B树等)及其在Java中的实现。通过递归方法实现了二叉树的前序、中序、后序和层次遍历,并展示了具体的代码示例和运行结果。掌握树结构有助于提高编程能力,优化算法设计。
39 9
 算法系列之数据结构-二叉树
|
2月前
|
C++
【C++数据结构——树】二叉树的性质(头歌实践教学平台习题)【合集】
本文档介绍了如何根据二叉树的括号表示串创建二叉树,并计算其结点个数、叶子结点个数、某结点的层次和二叉树的宽度。主要内容包括: 1. **定义二叉树节点结构体**:定义了包含节点值、左子节点指针和右子节点指针的结构体。 2. **实现构建二叉树的函数**:通过解析括号表示串,递归地构建二叉树的各个节点及其子树。 3. **使用示例**:展示了如何调用 `buildTree` 函数构建二叉树并进行简单验证。 4. **计算二叉树属性**: - 计算二叉树节点个数。 - 计算二叉树叶子节点个数。 - 计算某节点的层次。 - 计算二叉树的宽度。 最后,提供了测试说明及通关代
60 10
|
2月前
|
Java C++
【C++数据结构——树】二叉树的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现二叉树的基本运算。​ 相关知识 创建二叉树 销毁二叉树 查找结点 求二叉树的高度 输出二叉树 //二叉树节点结构体定义 structTreeNode{ intval; TreeNode*left; TreeNode*right; TreeNode(intx):val(x),left(NULL),right(NULL){} }; 创建二叉树 //创建二叉树函数(简单示例,手动构建) TreeNode*create
61 12
|
2月前
|
数据采集 存储 算法
【C++数据结构——图】图的遍历(头歌教学实验平台习题) 【合集】
本文介绍了图的遍历算法,包括深度优先遍历(DFS)和广度优先遍历(BFS)。深度优先遍历通过递归方式从起始节点深入探索图,适用于寻找路径、拓扑排序等场景;广度优先遍历则按层次逐层访问节点,适合无权图最短路径和网络爬虫等应用。文中提供了C++代码示例,演示了如何实现这两种遍历方法,并附有测试用例及结果,帮助读者理解和实践图的遍历算法。
61 0
|
2月前
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
60 2
|
3月前
|
数据库
数据结构中二叉树,哈希表,顺序表,链表的比较补充
二叉搜索树,哈希表,顺序表,链表的特点的比较
数据结构中二叉树,哈希表,顺序表,链表的比较补充
|
4月前
|
机器学习/深度学习 存储 算法
数据结构实验之二叉树实验基础
本实验旨在掌握二叉树的基本特性和遍历算法,包括先序、中序、后序的递归与非递归遍历方法。通过编程实践,加深对二叉树结构的理解,学习如何计算二叉树的深度、叶子节点数等属性。实验内容涉及创建二叉树、实现各种遍历算法及求解特定节点数量。
138 4
|
10天前
|
算法 调度 C++
STL——栈和队列和优先队列
通过以上对栈、队列和优先队列的详细解释和示例,希望能帮助读者更好地理解和应用这些重要的数据结构。
25 11
|
24天前
|
DataX
☀☀☀☀☀☀☀有关栈和队列应用的oj题讲解☼☼☼☼☼☼☼
### 简介 本文介绍了三种数据结构的实现方法:用两个队列实现栈、用两个栈实现队列以及设计循环队列。具体思路如下: 1. **用两个队列实现栈**: - 插入元素时,选择非空队列进行插入。 - 移除栈顶元素时,将非空队列中的元素依次转移到另一个队列,直到只剩下一个元素,然后弹出该元素。 - 判空条件为两个队列均为空。 2. **用两个栈实现队列**: - 插入元素时,选择非空栈进行插入。 - 移除队首元素时,将非空栈中的元素依次转移到另一个栈,再将这些元素重新放回原栈以保持顺序。 - 判空条件为两个栈均为空。
|
2月前
|
存储 C语言 C++
【C++数据结构——栈与队列】顺序栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现顺序栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 1.初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储
160 77