二叉树遍历
来源:互联网 发布:人工蜂群算法 编辑:程序博客网 时间:2024/05/21 22:35
#include <stdio.h>#include <stdlib.h>#define MAX 50//二叉树链表存储结构typedef struct btnode{ int data; //结点数据内容 struct btnode *Llink; //左子树指针 struct btnode *Rlink; //右子树指针}btnode, *btreetype;/****---------------------------------------------****///函数名: OutputTree(btreetype &root)//参数: (传入)btreetype &root 二叉树指针//功能: 输出二叉树/****---------------------------------------------****/void OutputTree(btreetype &root){ btreetype p; //打印左子树 p = root->Llink; printf("建立的二叉树的左子树:"); while(p != NULL) { printf("%d ",p->data); p = p->Llink; } //打印右子树 p = root->Rlink; printf("\n建立的二叉树的右子树为:"); while(p != NULL) { printf("%d ", p->data); p = p->Rlink; }}/****--------------------------------------------****///函数名: PreOrder(btreetype &root)//参数: (传入)btreetype &root二叉树指针//功能: 先序遍历二叉树/****--------------------------------------------****/void PreOrder(btreetype &root){ btreetype p; p = root; if(p != NULL) { printf("%d ",p->data); PreOrder(p->Llink); //递归处理左子树 PreOrder(p->Rlink); //递归处理右子树 }}/****--------------------------------------------****///函数名: InOrder(btreetype &root)//参数: (传入)btreetype &root二叉树指针//功能: 中序遍历二叉树(递归方式)/****--------------------------------------------****/void InOrder(btreetype &root){ btreetype p; p = root; if(p != NULL) { InOrder(p->Llink); //递归处理左子树 printf("%d ", p->data); InOrder(p->Rlink); //递归处理右子树 }}/****-------------------------------------------****///函数名: InOrder(btreetype &root)//参数: (传入)btreetype &root二叉树指针//功能: 中序遍历二叉树(非递归方式)/****--------------------------------------------****/void InOrder_Norecursion(btreetype &root){ btreetype stack[MAX]; btreetype p; int top = 0; p = root; do { while(p != NULL) //扫描左结点 { top++; stack[top] = p; p = p->Llink; } if(top > 0) { p = stack[top]; //p所指结点为无左子树或其左子树已遍历过 top--; printf("%d ", p->data); p = p->Rlink; //扫描右结点 } }while(p != NULL || top != 0);}/****--------------------------------------------****///函数名: PostOrder(btreetype &root)//参数: (传入)btreetype &root 二叉树指针//功能: 后序遍历二叉树/****--------------------------------------------****/void PostOrder(btreetype &root){ btreetype p; p = root; if(p != NULL) { PreOrder(p->Llink); //递归处理左子树 PreOrder(p->Rlink); //递归处理右子树 printf("%d ", p->data); }}/****--------------------------------------------****///函数名: CreateTree(int n)//参数: (传入)int n数据数量//返回值: 返回二叉树(根结点)指针//功能: 建立二叉树/****--------------------------------------------****/btreetype CreateTree(int n){ int i; btreetype root = NULL; for(i = 0; i < n; i++) { btreetype newNode; btreetype currentNode; btreetype parentNode; //建立新结点 newNode = (btreetype)malloc(sizeof(btnode)); scanf("%d", &newNode->data); /*新结点赋值*/ newNode->Llink = NULL; newNode->Rlink = NULL; currentNode = root; //存储当前结点指针 if(currentNode == NULL) root = newNode; //以新结点作为二叉树根结点 else { while(currentNode != NULL) { parentNode = currentNode; //存储当前结点的父结点 if(newNode->data < currentNode->data) //比较结点数值大小 currentNode = currentNode->Llink; //左子树 else currentNode = currentNode->Rlink; //右子树 } //根据数值大小连接父结点和子结点 if(newNode->data < parentNode->data) parentNode->Llink = newNode; else parentNode->Rlink = newNode; }//else }//for return root;}/****------------测试主程序------------------****/int main(){ btreetype btree; int count; printf("input the number of elements:\n"); scanf("%d", &count); printf("input data(num = %d):\n", count); btree = CreateTree(count); //二叉树的各种遍历 printf("\n先序遍历建立的二叉树:"); PreOrder(btree); printf("\n中序遍历建立的二叉树(递归方式):"); InOrder(btree); printf("\n中序遍历建立的二叉树(非递归方式):"); InOrder_Norecursion(btree); printf("\n后序遍历建立的二叉树:"); PostOrder(btree); return 0;}
阅读全文
0 0
- 二叉树遍历、分层遍历
- 遍历二叉树--二叉树
- 【树】遍历二叉树
- 二叉树遍历
- 二叉树遍历
- 二叉树的遍历
- (原创)遍历二叉树
- 二叉树遍历-php
- 查找--遍历二叉树
- 遍历二叉树
- 二叉树遍历规则
- 二叉树的遍历
- 二叉树遍历
- 遍历二叉树
- 二叉树遍历问题
- 二叉树遍历
- 二叉树遍历(zz)
- 二叉树的遍历
- iOS逆向教程 1.1 逆向工程的介绍
- bzoj 5223. 【GDOI2018模拟7.12】B 动态规划+矩阵乘法
- 漫画告诉你什么是DDoS攻击?
- 算法第一节:枚举法解决“百鸡百钱”问题
- zookeeper leader选举 源码分析
- 二叉树遍历
- php学习笔记--session的销毁
- crontab 详解
- 使用VMware 如何为虚拟机扩展磁盘空间
- linux静默式安装weblogic10.3.6
- ssh免密登录
- 图片编辑中的图片添加,旋转,缩放,删除;文字的添加,大小缩放,字体更换,颜色更换,删除
- linux系统打开telnet端口的方法
- 7.12图论练习赛 T3 幻想乡的例大祭 (tarjan + SPFA)