数据结构 二叉树及中序、先序和后序输出
来源:互联网 发布:qq网络诈骗案例分析 编辑:程序博客网 时间:2024/06/05 03:27
当初写个论坛分页,对二叉树感到很新奇,简单分页的话都不难,可谓一种神奇的结构,事实上搜索引擎也是大的树吧。
其中水平的顺序输入树后,找到相对应的节点的位置的算法相当微妙。二叉树中0代表空,按-1结束输入。可以进行中序,先序和后序输出。
还是分为 tree.h ,tree .c , main.c
tree.h
#include<stdio.h>#include<malloc.h>#define MAX 100typedef int DataType;typedef struct BinTree *PNode;struct BinTree{DataType info;PNode llink;PNode rlink;};typedef struct BinTree *PTree;PTree createTree();void levelorder(PTree ptree);int isEmptyTree(PTree ptree);PTree initTree(PTree ptree,DataType *data,int number);PNode rootOfTree(PTree ptree);PNode llinkTree(PTree ptree); PNode rlinkTree(PTree ptree);void visit(PNode pnode);PNode parentTree(PTree ptree,PNode pnode);void inorder(PTree ptree); void preorder(PTree ptree);void backorder(PTree ptree);int depth(PTree ptree);int leafNumber(PTree ptree);
tree .c
#include "tree.h"int main(){int data[100];int n = 0;PTree ptree = createTree();printf("Please input the data of tree in level order(ending with -1:\n");while(1){scanf("%d",&data[n]);if(data[n] == -1) break;n++;}//printf("%d",n);// 自己发毛了 init只是return tree 我竟然没有把原始的ptree 赋值进去! ptree = initTree(ptree,data,n);printf("the depth is %d \n",depth(ptree));printf(" the leafnumber is %d\n",leafNumber(ptree));//levelorder(ptree);//visit(ptree);printf("\n");printf("the level order is : \n");levelorder(ptree);printf("the in order is : \n");inorder(ptree);}
main.c
#include "tree.h"#include<malloc.h>PTree createTree(){PTree ptree = (PTree)malloc(sizeof(struct BinTree));if(ptree == NULL) printf("create fail");ptree ->llink = NULL;ptree ->rlink = NULL;return ptree;}void levelorder(PTree ptree){int i,j;PNode pnode[MAX] = {NULL};pnode[0] = ptree;i = 0; j = 1; while(j>i){PNode temp = pnode[i];if(temp != NULL){if(temp ->llink != NULL) pnode[j++] = temp ->llink;if(temp ->rlink != NULL) pnode[j++] = temp ->rlink;printf("%d\n",temp->info);}i++; } printf("\n");}int isEmptyTree(PTree ptree){return (ptree ->llink==NULL&&ptree ->rlink==NULL);}PTree initTree(PTree ptree,DataType *data,int number){int i;PNode temp;PNode pnode[MAX] ={NULL}; for(i = 0; i<number ; i++){//the 0 represent the node NULLif(data[i] != 0) // 尝试不分配空间 直接用数组的pnode 直接赋值 //不行 只是数组而已 里面的空间没有分配出来 temp = (PNode)malloc(sizeof(struct BinTree));temp ->llink = NULL;temp ->rlink = NULL;temp ->info = data[i]; pnode[i] = temp;//printf("%d \n",pnode[i]->info);}for(i = 0; i<number ; i++){if(pnode[i] != NULL && i*2+1 < MAX) pnode[i] ->llink = pnode[i*2+1];}for(i = 0; i<number ; i++){if(pnode[i] != NULL && i*2+2 < MAX) pnode[i] ->rlink = pnode[i*2+2];}ptree = pnode[0];return ptree;}PNode rootOfTree(PTree ptree){PNode p ;if(ptree == NULL) printf("the root does not exist"); p = ptree;return p;} PNode llinkTree(PTree ptree){if(ptree == NULL) printf("the llink does not exist");return NULL;return ptree->llink;}PNode rlinkTree(PTree ptree){ if(ptree == NULL) printf("the rlink does not exist");return ptree->rlink;}void visit(PNode pnode){if(pnode == NULL) printf("it is null");printf("%d",pnode->info);}PNode parentTree(PTree ptree,PNode pnode){PNode temp = NULL;if(ptree == NULL){printf("it is null");return NULL;}else if(pnode = ptree){printf("it is null");return NULL;}else if(ptree ->llink == pnode || ptree ->rlink == pnode)return ptree;if(ptree != NULL && temp == NULL) temp = parentTree(ptree->llink,pnode);if(ptree != NULL && temp == NULL) temp = parentTree(ptree->rlink,pnode);return temp;}void inorder(PTree ptree){if(ptree == NULL) return;inorder(ptree ->llink);visit(rootOfTree(ptree));inorder(ptree ->rlink);}void preorder(PTree ptree){ if(ptree == NULL) return; visit(rootOfTree(ptree)); preorder(ptree ->llink);preorder(ptree ->rlink);}void backorder(PTree ptree){if(ptree == NULL) return; backorder(ptree ->llink);backorder(ptree ->rlink); visit(rootOfTree(ptree));}int depth(PTree ptree){int i = 0,j = 0;//if(ptree != NULL )//return 1;if(ptree == NULL) return 0;if(ptree != NULL){i = depth(ptree ->llink);j = depth(ptree ->rlink);}return i>j?i+1:j+1;}int leafNumber(PTree ptree){int i = 0;if(ptree != NULL && ptree ->llink == NULL && ptree ->rlink == NULL){//printf("%d",ptree ->info);return 1;}if(ptree == NULL) return 0;if(ptree != NULL){i = leafNumber(ptree ->llink)+leafNumber(ptree ->rlink);}return i;}
这些基础的东西,看到了指针的用处,真的很灵活,自由度高,对于一些人来讲,确实是王道。
- 数据结构 二叉树及中序、先序和后序输出
- 二叉树建立 先序 中序 后序输出
- 【二叉树】 先,中,后序遍历输出
- 由先序和中序构造二叉树并后序输出
- HDU1710利用二叉树的先序和中序输出后序
- 先序和中序重建二叉树 后序输出
- 【二叉树】 根据先序和中序遍历输出后序遍历
- 数据结构--java实现二叉树的先序、中序、后序、层次遍历及根据先序中序建立二叉树
- 【数据结构作业四】以二叉链表作存储结构,建立一棵二叉树,并输出该二叉树的先序、中序、后序遍历序列、高度和其叶子结点数。
- 先序和后序构造二叉树,后序和中序构造二叉树
- python数据结构之树和二叉树(先序遍历、中序遍历和后序遍历)
- 动态二叉树的先序、中序、后序和层序遍历及转换为静态二叉树
- 数据结构课设 根据后序和中序遍历输出先序遍历
- 已知二叉树的先序遍历和中序遍历序列,输出后序遍历序列
- 给定二叉树的先序遍历和中序遍历,输出它的后序遍历序列
- 算法进化历程之“根据二叉树的先序和中序序列输出后序序列”
- 先序顺序输入结点值创建二叉树,并按先序,中序和后序遍历输出
- 根据先序和中序或后序和中序建立二叉树及树的遍历
- TextKit学习(三)NSTextStorage,NSLayoutManager,NSTextContainer和UITextView
- 调制解调笔记
- COCOS2D-X Lua 面向对象编程
- 实例二:Ajax返回Json在Java中的实现
- 基于TI Davinci架构的双核嵌入式应用处理器OMAPL138开发入门(TI达芬奇双核开发资料 [ .
- 数据结构 二叉树及中序、先序和后序输出
- 如何从 appdelegate.mm helloworldlayer.mm 中调用一个方法
- LoadRunner下DLL的调用
- 如何在windows上把你的项目提交到github
- C6000系列DSP的EMIFA接口 .
- LRM-00101: unknown parameter name 'location' LRM-00101: unknown parameter name 'valid_for' 粗心引起问题一例
- Ubuntu 12.04 部署 Git build Server
- Protection 1
- Flex应用程序的系统开发周期