已知先序遍历和中序遍历构建二叉树
来源:互联网 发布:yousee监控软件下载 编辑:程序博客网 时间:2024/06/03 21:24
学数据结构的树时选的实验,因为老师很水不讲代码,比较懵。在网上找了很多代码总是不尽如人意,晚上找到一个比较好的C语言代码(老师要求最好从C语言入手),刚看懂,原作者写的不错,先mark在这里,有空再补。
顺便吐槽下CSDN上的作者,贴代码时最起码让你自己写的测试能正确运行再发表,有的代码都不能编译通过,甚至有的代码free的对象都错了,要找到一个写的准确无误的代码都难…
这是原文代码,原文有图片描述,建议直接看原文(地址在文末)。
#define _CRT_SECURE_NO_WARNINGS #include <stdlib.h> #include<stdio.h> #include <string.h> #define N 100 typedef struct BiTNode { char data; struct BiTNode *lchild,*rchild; } BiTNode,* BITree; //先序遍历 void preOrder(BiTNode*root) { if (root==NULL) { return; } printf("%c ",root->data); preOrder(root->lchild); preOrder(root->rchild); } //中序遍历 void inOrder(BiTNode*root) { if (root==NULL) { return; } inOrder(root->lchild); printf("%c ",root->data); inOrder(root->rchild); } /************************************************************************/ /* 算法 1、通过先序遍历找到根结点A,再通过A在中序遍历的位置找出左子树,右子树 2、在A的左子树中,找左子树的根结点(在先序中找),转步骤1 3、在A的右子树中,找右子树的根结点(在先序中找),转步骤1 */ /************************************************************************/ //根据先序遍历和中序遍历创建二叉树 BiTNode* createBiTree(char *pre, char *in, int n) { int i = 0; int n1 = 0,n2 = 0; int m1 = 0,m2 = 0; BiTNode*node = NULL; char lpre[N],rpre[N]; char lin[N],rin[N]; if (n == 0) { return NULL; } node = (BiTNode*)malloc(sizeof(BiTNode)); if (node==NULL) { return NULL; } memset(node,0,sizeof(BiTNode)); //先序序列的第一个元素必为根结点 node->data = pre[0]; //根据根结点将中序序列分为左子树和右子数 for (i = 0;i<n;i++) { if ((i<=n1)&&(in[i]!=pre[0])) { lin[n1++] = in[i]; } else if(in[i]!=pre[0]) { rin[n2++] = in[i]; } } //根据树的先序序列的长度等于中序序列的长度 //且先序遍历是先左子树再后子树,无论先序还是中序 左子树和右子树的长度都是固定的 //主意 从i=1开始 因为先序遍历的第一个是根 for (i = 1;i < n;i++) { if (i< (n1+1))//n1代表了左子树的长度 { lpre[m1++] = pre[i]; } else { rpre[m2++] = pre[i]; } } node->lchild = createBiTree(lpre,lin,n1); node->rchild = createBiTree(rpre,rin,n2); return node; } int main() { char preNode[N]; char inNode[N]; int n = 0; char ch; BiTNode* root=NULL; printf("请输入先序序列\n"); while((ch = getchar())&&ch!='\n') preNode[n++] = ch; printf("请输入中序序列\n"); n = 0; while((ch = getchar())&&ch!='\n') inNode[n++] = ch; root = createBiTree(preNode,inNode,n); printf("先序序列\n"); preOrder(root); printf("\n中序序列\n"); inOrder(root); system("pause"); return 0; }
原文链接:http://blog.csdn.net/bbs375/article/details/52745107
阅读全文
0 0
- 已知先序遍历和中序遍历构建二叉树
- 中序遍历和先序遍历构建二叉树
- 六、树和二叉树--(3)已知先序遍历和中序遍历求后序遍历
- 二叉树已知先序遍历和中序遍历得到后序遍历
- 已知先序遍历和中序遍历求后序遍历——二叉树
- 已知先序遍历和中序遍历求后序遍历——二叉树
- 已知二叉树的先序遍历和中序遍历,如何求后序遍历
- java实现二叉树已知先序遍历和中序遍历求后序遍历
- 已知二叉树的先序和中序遍历,求后序遍历及二叉树
- 建立二叉树(已知中序遍历和先序遍历)
- 已知中序遍历和先序遍历重建二叉树
- 已知先序遍历和中序遍历求解二叉树
- 已知一棵二叉树的中序遍历和后序遍历,求二叉树的先序遍历
- 已知一棵二叉树的中序遍历和后序遍历,求二叉树的先序遍历
- 中序遍历和先序遍历/后序遍历构建二叉树
- 中序遍历和先序遍历/后序遍历构建二叉树
- 中序遍历和先序遍历/后序遍历构建二叉树
- 中序遍历和先序遍历/后序遍历构建二叉树
- Spring框架
- 图解Java多线程
- IOS 核心动画值CABasicAnimation
- MD5
- 各种奇怪的javascript语法
- 已知先序遍历和中序遍历构建二叉树
- Android基础(二)
- 1576: [Usaco2009 Jan]安全路经Travel
- R——数据框和小技巧
- 《AA费用小助手》-笔记1
- 原码, 反码, 补码 详解
- linux的主机规划与磁盘分区
- 【前端】html相关
- vector和list的区别