二叉树非递归的后序前序中序遍历
来源:互联网 发布:淘宝卖家星级 编辑:程序博客网 时间:2024/06/03 14:15
实现思路:从根节点开始遍历二叉树,不为空时将节点压入栈中,直到最后一个非空节点。然后判断此节点的是否有右孩子,如果右孩子为空,那么输出节点数据。否则判断右孩子是否是之前遍历过的(用pre指针记录之前遍历过多的节点指针),如果是那么输出此节点,否则右孩子压入栈中。
具体代码:
#include <stdio.h>#include <stdlib.h>struct node{char data;node *lchild;node *rchild;};void post_order(node *root){node *stack[100];int top = 0;node *pre = NULL;while (root!=NULL||top!=0){while (root!=NULL)//入栈{stack[top++] = root;root = root->lchild;}if (top!=0)//栈中的元素不为空时 进行处理{root = stack[top-1];//取出栈顶元素if (root->rchild==NULL||root->rchild==pre){//右节点为空 或者已经被访问过了 出栈printf("->%c ",root->data);top--;pre = root;root = NULL;//为了防止再次入栈 将他设为空}else{root = root->rchild;}}//if}//while}
有几点要注意的地方:
节点的数据输出之后才能出栈,即top--。
输出并处理这些节点的条件是栈不为空。
输出节点的数据之后,节点要置空,否则会再次将此节点压入栈中。
非递归的先序遍历
主要思路就是让根节点先入栈,然后出栈,访问根节点。然后让根节点的右子树入栈,左子树入栈,再按照上述方式来遍历,知道栈为空。
void pre_order(node *root){node *stack[100];int top = 0;if (root == NULL)return;stack[top++] = root;while (top!=0){printf("->%c ",stack[--top]->data);if (root->rchild != NULL)stack[top++] = root->rchild;if (root->lchild != NULL)stack[top++] = root->lchild;}}
非递归的中序遍历
中序遍历的思想是将根节点的左子树不断的压栈,直到最后一个不为空的节点,输出此节点,然后将root设置为右子树,返回while循环重复以上操作操作。
void in_order(node *root){node *stack[100];int top = 0;while (root != NULL||top!=0){while(root!=NULL){stack[top++] = root;root = root->lchild;//左子树不断的压栈}//和后序不同 先输出根节点root = stack[--top];printf("->%c ",root->data);root = root->rchild;}}
- 二叉树非递归的后序前序中序遍历
- 二叉树的递归,非递归遍历
- 二叉树的递归+非递归遍历
- 二叉树的递归非递归遍历
- 二叉树的遍历--递归+非递归
- 二叉树的递归、非递归遍历
- 二叉树的递归非递归遍历
- 二叉树的先中后序遍历,递归遍历,非递归遍历
- 二叉树的递归遍历与非递归遍历
- 二叉树的创建,递归遍历,非递归遍历
- 二叉树的递归遍历与非递归遍历
- 二叉树的非递归遍历以及递归遍历
- 二叉树的非递归遍历&递归遍历
- 二叉树的递归遍历和非递归遍历
- 二叉树的递归遍历与非递归遍历
- 二叉树的递归遍历和非递归遍历
- 二叉树的构造,递归遍历,非递归遍历
- 二叉树的遍历(递归+非递归+层次遍历)
- Apache Thrift 介绍
- Source Insight的设置:将函数名的字体设置为大号字体,加粗,醒目,方便阅读
- ORA-01552 cannot use system rollback segment for non-system tablespace
- 并查集题集(一)
- 会话管理
- 二叉树非递归的后序前序中序遍历
- 窗口关闭过程,非模态对话框为什么不能使用enddialog关闭窗口
- java web的知识点总结
- 事务实例(基于Mysql)
- oracle flash table
- TBODY的解释和用法
- 【曾国藩语录】
- c++ 函数返回引用
- JQuery Mobile入门——分割列表项