二叉树的前中后序的递归、非递归遍历
来源:互联网 发布:ge fanuc plc编程软件 编辑:程序博客网 时间:2024/05/01 02:49
C 代码
#include<stdio.h>#include<stdlib.h>#include<malloc.h>#define STACKSIZE 50/* * 定义二叉树结点以及二叉树的结构 */typedef struct BiTreeNode_{ char data; struct BiTreeNode_ *left; struct BiTreeNode_ *right;}BiTreeNode;typedef struct BiTree_{ int size; BiTreeNode *root;}BiTree;/* * 定义栈的结构 */typedef struct Stack_{ BiTreeNode * base[STACKSIZE]; int top; int stacksize;}Stack;void stack_init(Stack *stack){ stack->top = -1; stack->stacksize = 0;}void push(Stack *stack, BiTreeNode *node){ if (stack->stacksize == STACKSIZE) exit(-1); stack->base[++stack->top] = node; stack->stacksize++;}int stack_empty(Stack *stack){ if ((-1 == stack->top) && (0 == stack->stacksize)) return 1; else return 0;}BiTreeNode* pop(Stack *stack){ if (stack->top < 0) exit(-1); else { stack->stacksize--; return stack->base[stack->top--]; }}BiTreeNode* get_stack_top(Stack *stack){ if (stack->top < 0) exit(-1); return stack->base[stack->top];}void bitree_init(BiTree *tree){ tree->size = 0; tree->root = NULL;}//给树tree的某个结点node插入数据域为data的左子树int bitree_ins_left(BiTree *tree, BiTreeNode *node, const char data){ BiTreeNode *new_node, **position; if (NULL == node) { if (tree->size > 0) return -1; position = &tree->root; } else { if (node->left != NULL) return -1; position = &node->left; } if (NULL == (new_node = (BiTreeNode *)malloc(sizeof(BiTreeNode)))) return -1; new_node->data = data; new_node->left = NULL; new_node->right = NULL; *position = new_node; tree->size++; return 0;}//给树tree的某个结点node插入数据域为data的右子树int bitree_ins_right(BiTree *tree, BiTreeNode *node, const char data){ BiTreeNode *new_node, **position; if (NULL == node) { if (tree->size > 0) return -1; position = &tree->root; } else { if (node->right != NULL) return -1; position = &node->right; } if (NULL == (new_node = (BiTreeNode *)malloc(sizeof(BiTreeNode)))) return -1; new_node->data = data; new_node->left = NULL; new_node->right = NULL; *position = new_node; tree->size++; return 0;}// 先序遍历函数void pre_order(const BiTreeNode *node){ if (node) { printf("%c", node->data); pre_order(node->left); pre_order(node->right); }}// 中序遍历函数void in_order(const BiTreeNode *node){ if (node) { in_order(node->left); printf("%c", node->data); in_order(node->right); }}// 后序遍历函数void end_order(const BiTreeNode *node){ if (node) { end_order(node->left); end_order(node->right); printf("%c", node->data); }}// 先序遍历函数(非递归void pre_order_norec(const BiTreeNode *node){ Stack stack; stack_init(&stack); push(&stack, node); while (stack.stacksize != 0) { BiTreeNode *p = pop(&stack); if (p == NULL) { putchar(' '); } else { printf("%c", p->data); push(&stack, p->right); push(&stack, p->left); } }}// 中序遍历函数(非递归void in_order_norec(const BiTreeNode *node){ Stack stack; stack_init(&stack); push(&stack, node); while (stack.stacksize != 0) { BiTreeNode *p = pop(&stack); while (p->left) { push(&stack, p); p = p->left; } putchar(' '); printf("%c", p->data); if (p->right) { push(&stack, p); push(&stack, p->right); } else { putchar(' '); while (stack.stacksize != 0) { BiTreeNode *from = pop(&stack); if (from->left == p) { printf("%c", from->data); push(&stack, from); if (from->right) { push(&stack, from->right); break; } else { putchar(' '); p = from; } } else { p = from; } } } }}// 后序遍历函数(非递归void end_order_norec(const BiTreeNode *node){}int main(){ char data; Stack stack; BiTree tree; BiTreeNode *node; stack_init(&stack); bitree_init(&tree); printf("请以先序顺序输入结点值: \n"); data = getchar(); if (0 == tree.size) { if (' ' == data) return -1; bitree_ins_left(&tree, NULL, data); push(&stack, tree.root); } while (!stack_empty(&stack)) { data = getchar(); if (' ' == data) { node = pop(&stack); if (NULL == node->left) { data = getchar(); if (' ' != data) { bitree_ins_right(&tree, node, data); push(&stack, node->right); } } } else { node = get_stack_top(&stack); if (NULL == node->left) { bitree_ins_left(&tree, node, data); push(&stack, node->left); } else { node = pop(&stack); bitree_ins_right(&tree, node, data); push(&stack, node->right); } } } printf("-----先序递归遍历二叉树-----\n"); pre_order(tree.root); putchar('\n'); printf("-----中序递归遍历二叉树-----\n"); in_order(tree.root); putchar('\n'); printf("-----后序递归遍历二叉树-----\n"); end_order(tree.root); putchar('\n'); printf("-----先序非递归遍历二叉树-----\n"); pre_order_norec(tree.root); putchar('\n'); printf("-----中序非递归遍历二叉树-----\n"); in_order_norec(tree.root); putchar('\n'); printf("-----后序非递归遍历二叉树-----\n"); end_order_norec(tree.root); putchar('\n'); return 0;}
阅读全文
1 0
- 二叉树的递归,非递归遍历
- 二叉树的递归+非递归遍历
- 二叉树的递归非递归遍历
- 二叉树的遍历--递归+非递归
- 二叉树的递归、非递归遍历
- 二叉树的递归非递归遍历
- 二叉树的前中后序的递归、非递归遍历
- 递归、非递归实现二叉树的前中后序遍历
- 二叉树的前中后序遍历-递归和非递归实现
- 二叉树的前中后序遍历,递归和非递归方式
- 二叉树的创建与前中后序遍历递归非递归
- 二叉树的前中后序递归与非递归遍历
- 二叉树的先中后序遍历,递归遍历,非递归遍历
- 二叉树的递归遍历与非递归遍历
- 二叉树的创建,递归遍历,非递归遍历
- 二叉树的递归遍历与非递归遍历
- 二叉树的非递归遍历以及递归遍历
- 二叉树的非递归遍历&递归遍历
- 勤劳致富:误导中国人5000年
- 你只有足够强大,你说的NO才有用
- 做好管理,哪些事不能放手?
- 我好像是已经"苏郎才尽"了
- 三十岁——男人创业的最佳时机
- 二叉树的前中后序的递归、非递归遍历
- C++保留小数位数
- 女人不喜欢什么样的女人
- 你已经有我了,怎么还能说自己是lo…
- too young too nai…
- 筱懿今晚对你说——
- 我发朋友圈并不是为了取悦你
- 给员工发奖金却听不见响儿,怎么办…
- 最好的爱情,是彼此觉得高攀了对方