树的遍历很多包括,先序、中序、后序、层次,其中先中后序都可分两种方式:递归和非递归(我用栈实现),层次我用两种方法:栈和队列;代码如下(第一次发博): 1//BinTree.c2#include <stdbool.h>3//树节点4structTreeNode{5charNum;6structTreeNode *Left;7structTreeNode *Right;8};9typedef TreeNode *BinTr...
记住:树的组成部分有三块(也可以两块),一个存放孩子链表结点的结构体,另一个是双亲结点结构体,双亲结点结构体里面包含着孩子链表结构体,双亲结点结构体做成数组后就是一个树了,所以说其实两部分也可以组成一棵树,但是为了简洁明了方便后续森林的操作,我们还是把这结构体数组放在一个结构体中形成新一棵树比较好。
正如我们前面看到的,这类例程当用到树的时候称为中序遍历(由于它依序列出了关键字,因此是有意义的)。中序遍历的一般策略是首先遍历左子树,然后是当前节点,最后遍历右子树。这个算法的有趣部分除它简单的特性外,还在于其总的运行时间是 。这是因为在树的每一个节点处运行的工作都是常数时间的。每一个节点访问依...
先序遍历(先根遍历):PreOrder(T)——从二叉树的根结点开始,按照根结点、左子树、右子树的顺序完成遍历; 中序遍历(总根遍历):InOrder(T)——从二叉树的左子树开始,按照左子树、根结点、右子树的顺序完成遍历; 后序遍历(后根遍历):PostOrder(T)——从二叉树的左子树开始,按照左子树、右子树、根结点的顺序完...
1. 创建一颗二叉树 依据前序遍历创建二叉树:,树结构如上图所示 输入: ABD##E##C## #include <stdio.h> #include <stdlib.h> // 二叉树的实现 // 定义 二叉树的 结构体 typedef struct node{ char data; struct node *left; struct node *right; ...
1、先序遍历(先访问根节点) 先访问根节点 再先序遍历左子树 再先序遍历右子树 例:下图:先访问根节点A,再先序访问A的左子树B。A的左子树B是一个树 ,所以先访问树B的根节点B,再访问B的左子树D。B的左子树D是一个树,所以先访问D的根节点D,再访问D的左子树,D没有左子树,再访问D的右子树,D没有右子...
观察整个先序遍历二叉树的过程会发现,访问每个结点的过程都是相同的,可以用递归的方式实现二叉树的先序遍历。 对于顺序表存储的二叉树,递归实现先序遍历二叉树的 C 语言代码为: void PreOrderTraverse(BiTree T, int p_node) { //根节点的值不为 0,证明二叉树存在 ...
后序遍历二叉树,最常用的实现方式就是递归。对于顺序表存储的二叉树,递归实现后序遍历的 C 语言程序为:void PostOrderTraverse(BiTree T, int p) { if ((p * 2 + 1 < NODENUM) && (T[p * 2 + 1] != 0)) { PostOrderTraverse(T, 2 * p + 1); } if ((p * 2 + 2 <...
左值从 1 开始,对树进行深度优先遍历,每访问一个节点,就分配一个左值,然后再分配一个右值。 在这个例子中,我们首先访问 A,分配左值 1。然后我们访问 B,分配左值 2。接着我们访问 D,分配左值 3 和右值 4。回到 B,分配右值 7。然后是 E,分配左值 5 和右值 6。回到 A,分配右值 10。最后是 C,分配左值 ...
printf("%c", T ->data);/*对结点进行操作(可替换成其它操作)*/PreOrderTraverse(T->lchild);/*先序遍历左子树*/PreOrderTraverse(T->rchild);/*先序遍历右字树*/}//***//【中序】遍历算法//二叉树不空,从根结点开始(并非是先访问根结点),中序遍历根节点的左子树,//然后访问根结点,最后中序遍历...