二叉树 后序遍历 的两种方法:
1.递归 后序遍历二叉树;
2.利用链栈 非递归 后序遍历二叉树
以下代码 在 vs2010 测试通过:
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
typedef struct TreeNode{
int data;
struct TreeNode *lchild,*rchild;
}TreeNodePro;
typedef struct StackNode{
TreeNodePro *treenode;
struct StackNode *next;
}StackNodePro;
typedef struct StackList{
int count;
StackNodePro *top;
}StackListPro;
//递归 建立二叉树
void create_behorder_tree(TreeNodePro **tree){
int em ;
int result;
printf("请输入二叉树节点的数值:");
result = scanf("%d",&em);
if(result != 0 ){
if(em == 0){
*tree = NULL;
}else{
*tree = (TreeNodePro *)malloc(sizeof(TreeNodePro));
if(*tree != NULL){
(*tree)->data = em;
create_behorder_tree((&(*tree)->lchild));
create_behorder_tree((&(*tree)->rchild));
}
}
}
}
//递归 后序遍历二叉树
void recursive_behorder_tree(TreeNodePro *tree){
if(tree != NULL){
recursive_behorder_tree(tree->lchild);
recursive_behorder_tree(tree->rchild);
printf("%d\t",tree->data);
}
}
//新建一个栈
void stack_init(StackListPro **stack){
*stack = (StackListPro *)malloc(sizeof(StackListPro));
if(stack != NULL){
(*stack)->top = NULL;
(*stack)->count = 0 ;
}
}
//入栈
void stack_push(StackListPro *stack,TreeNodePro *tree){
StackNodePro *snode;
snode = (StackNodePro *)malloc(sizeof(StackNodePro));
if(snode != NULL){
snode->treenode = tree;
snode->next = stack->top;
stack->top = snode;
stack->count++;
}
}
//出栈
TreeNodePro * stack_pop(StackListPro *stack){
if(stack != NULL && stack->top > 0){
StackNodePro *pstack;
TreeNodePro *ptree;
pstack = stack->top;
ptree = stack->top->treenode;
stack->top = stack->top->next;
stack->count--;
free(pstack);
return ptree;
}
}
//获取栈顶元素
TreeNodePro* get_stack_top(StackListPro *stack){
if(stack->top != NULL && stack->count > 0){
return stack->top->treenode;
}
return NULL;
}
/*
* 利用链栈 非递归 后序遍历二叉树
* 解题思路:
* 1.依次遍历二叉树,若存在做孩子则将该节点入栈,直至遍历的节点左孩子为空
* 2.获得栈顶节点,然后将栈顶节点作为新的父节点,继续遍历二叉树,若存在做孩子则入栈
* 3.如不存在左孩子,存在右孩子,则重复 2 的步骤
* 4.如不存在左孩子,也不存在右孩子,则打印出该节点的值
*/
void unrecursive_behorder_tree(TreeNodePro *tree){
//建栈
StackListPro *stack;
stack_init(&stack);
TreeNodePro *ptree;
TreeNodePro *tmptree = NULL;
ptree = tree;
while(ptree != NULL || stack->count > 0){
while(ptree != NULL){
stack_push(stack,ptree);
ptree = ptree->lchild;
}
ptree = get_stack_top(stack); //获取栈顶元素
if(ptree->rchild == NULL || ptree->rchild == tmptree ){ //判断该节点的右孩子是否已被访问
ptree = stack_pop(stack);
printf("%d\t",ptree->data);
tmptree = ptree;
ptree = NULL;
}else{
ptree = ptree->rchild;
}
}
}
int _tmain(int argc, _TCHAR* argv[]){
//递归 建立二叉树
TreeNodePro *tree = NULL;
create_behorder_tree(&tree);
//递归 后序遍历二叉树
printf("\n递归法后序遍历二叉数:\n");
recursive_behorder_tree(tree);
//非递归 后序遍历二叉树
printf("\n非递归法后序遍历二叉树:\n");
unrecursive_behorder_tree(tree);
printf("\n");
system("pause");
return 0;
}
运行结果:
数据结构 -- 二叉树后序遍历,布布扣,bubuko.com
原文:http://blog.csdn.net/lofter_h/article/details/20227411