对于顺序表存储的二叉树,非递归实现后序遍历的 C 语言程序为:#include <stdio.h>#define NODENUM 7#define ElemType int//自定义 BiTree 类型,表示二叉树typedef ElemType BiTree[NODENUM];int top = -1;//表示栈顶typedef struct SNode { int p; //结点所在顺序表的下标 int tag; //标记...
先序遍历(先根遍历):PreOrder(T)——从二叉树的根结点开始,按照根结点、左子树、右子树的顺序完成遍历; 中序遍历(总根遍历):InOrder(T)——从二叉树的左子树开始,按照左子树、根结点、右子树的顺序完成遍历; 后序遍历(后根遍历):PostOrder(T)——从二叉树的左子树开始,按照左子树、右子树、根结点的顺序完...
PostOrderTraverse(Tree); // 先序递归进行 printf("\n"); // 最后换行 return 0; } 运行结果: 后序遍历: H I D E B F G C A 非递归实现 相比于之前的先序遍历和中序遍历非递归实现,后序遍历的非递归算法与之前有所不同,后续遍历需要先访问左右子结点后,才能访问该结点,而这也是非递归的难点所在。
2.2 具体代码 // rootNode 为根节点 S为栈voidMiddleOrderTraverse(node*rootNode,ware*S){initWare(S);// 初始化栈node*visiteNode;node*currentNode=rootNode;printf("中序遍历:");while(currentNode||S->top!=-1){if(currentNode){Push(S,currentNode);currentNode=currentNode->leftChild;}else{visite...
后序遍历过程 a. 先序遍历其左子树; b. 先序遍历其右子树; c. 访问根节点; 然后就是一直递归下去,在访问到节点的时候,可以进行节点的相关处理,比如说简单的访问节点值 下图是一棵二叉树,我们来手动模拟一下后序遍历过程 按照上述后序遍历的过程,得到后序遍历序列: ...
根据上述分析,我们可以用C语言实现如下的算法:定义一个结构体,表示二叉树的节点,包含值、左孩子和右孩子三个字段。定义一个函数,根据中序遍历和后序遍历序列构造二叉树,并返回根节点的指针。如果后序遍历序列为空,说明是空树,返回NULL。如果后序遍历序列只有一个元素,说明是叶子节点,创建一个新节点并返回...
首先非常感谢‘hicjiajia’的博文:二叉树后序遍历(非递归) 这篇随笔开启我的博客进程,成为万千程序员中的一员,坚持走到更远! 折磨了我一下午的后序遍历中午得到解决,关键在于标记右子树是否被访问过,考虑过修改二叉树结点的数据结构,增加一个visit域,或者建一个栈存储已访问的结点。都比较麻烦没有调试成功。若将...
它的后序遍历顺序为:GHDBIEFCA(规则是先后序遍历左子树,再是后序遍历右子树,再是根结点) 如果不懂的话,可以参看有关数据结构的书籍。。 1,二叉树的存储结构(二叉链表) //二叉树的二叉链表结构,也就是二叉树的存储结构,1个数据域,2个指针域(分别指向左右孩子)typedefstructBiTNode ...
// 二叉树的中序遍历递归算法voidinOrderTraversal(TreeNode*T){if(NULL==T){return;}else{inOrderTraversal(T->lchild);// 中序遍历左子树printf("%c ",T->data);// 显示节点数据,可以更改为其他对节点的操作inOrderTraversal(T->rchild);// 最后中序遍历右子树}}// 二叉树的后序遍历递归算法void...
题目 已知二叉树前序为 ABDFGCEH 后序序列为 BFDGACEH ,要求输出后序遍历为 FGDBHECA 大体思路 又先序得出根,先序的根后为左树一部分,我们再在中序序列里找到先序的根,此处之前即为左树(可以画图好好理解下),此处之后为右树。然后就是不断递归即可。 代码 #include #