重建二叉树 C语言实现
来源:互联网 发布:lesscss1.4.0.min.js 编辑:程序博客网 时间:2024/06/03 20:49
主要根据编程之美中利用前序与中序遍历实现二叉树的重构。其中对于前序遍历中的每一个节点都是当前子树的根节点这一理论来对中序遍历进行划分。
并且也实现了根据中序遍历与后序遍历实现二叉树的重构,其中对于后序遍历主要要注意其中后序遍历的最后一个元素表示的是根节点这一思想来实现。其中对于利用前序遍历与中序遍历实现二叉树的重构的算法思想可以参考博客http://blog.csdn.net/hinyunsin/article/details/6315502。主要实现代码如下:
#include <stdio.h>#include <math.h>#include <string.h>#include <stdlib.h>typedef char Status;typedef struct Node{struct Node* Left;struct Node* Right;char Value;}Node;/*利用前序遍历与中序遍历重构二叉树*/void ReBulid(Status *pPreOrder,Status *pInOrder,int len,Node **pRoot){Node *pTemp=(Node *)malloc(sizeof(Node));int count=0; //计数Status *pOrgInOrder=pInOrder;Status *pLeft=pInOrder;int leftnum=0;int rightnum=0;(*pTemp).Value=*pPreOrder; //保存前序遍历的值的第一个节点pTemp->Left=NULL;pTemp->Right=NULL;/*边界检测*/if (pPreOrder ==NULL || pInOrder==NULL)return;if (*pRoot==NULL)*pRoot=pTemp;if (len==1)return;while (*pPreOrder!=*pLeft){pLeft++;}leftnum=(int)(pLeft-pOrgInOrder);rightnum=(int)(len-leftnum-1);if (leftnum>0)ReBulid(pPreOrder+1,pInOrder,leftnum,&((*pRoot)->Left));if (rightnum>0)ReBulid(pPreOrder+leftnum+1,pInOrder+leftnum+1,rightnum,&((*pRoot)->Right));}/*利用中序遍历与后序遍历重构二叉树*/void ReBulid1(Status *pPostOrder,Status *pInOrder,int len,Node **pRoot){Node *pTemp=(Node *)malloc(sizeof(Node));int count=len-1; //计数Status *pOrgInOrder=pInOrder;Status *pLeft=pPostOrder+len-1; //指向后序遍历的最后一个节点Status *pInLeft=pInOrder;int leftnum=0;int rightnum=0;pTemp->Value=*pLeft; //保存后序遍历的值的最后一个节点pTemp->Left=NULL;pTemp->Right=NULL;/*边界检测*/if (pInOrder ==NULL || pPostOrder==NULL)return;if (*pRoot==NULL)*pRoot=pTemp;if (len==1)return;while (*pInLeft!=*pLeft){pInLeft++;}leftnum=(int)(pInLeft-pOrgInOrder);rightnum=len-leftnum-1;if (leftnum>0)ReBulid1(pPostOrder,pInOrder,leftnum,&((*pRoot)->Left));if (rightnum>0)ReBulid1(pPostOrder+leftnum,pInOrder+leftnum+1,rightnum,&((*pRoot)->Right));}int main(){char *cP="ABCDEF";char *cI="CBAEDF";char *cPo="CBEFDA";Node *pRoot=NULL;Node *pRoot1=NULL;int len=strlen(cP);ReBulid(cP,cI,len,&pRoot);ReBulid1(cPo,cI,len,&pRoot1);system("pause");return 0;}
- 重建二叉树 C语言实现
- 【面试算法系列】已知二叉树的前序和中序遍历重建二叉树 - C语言实现
- 剑指offer06题二叉树的重建(c语言)
- java实现重建二叉树
- java实现重建二叉树
- java实现 重建二叉树
- 重建二叉树java实现
- JS实现重建二叉树
- C语言实现二叉树
- C语言实现二叉树
- C语言实现二叉树
- C语言实现二叉树
- 由前序遍历和中序遍历重建二叉树和C语言模式实现C++继承和多态——题集(十四)
- 重建二叉树(字符串操作实现)
- 二叉树的重建(递归实现)
- 重建二叉树(链表实现)
- 剑指offer 重建二叉树 java实现
- 重建二叉树(C++递归实现)
- Win7系统下安装Ubuntu12.04(EasyBCD硬盘安装)
- 十四、更为灵活地访问内存
- Ubuntu下Swift多节点安装测试小结
- 如何自定义标签
- C/C++混合编程
- 重建二叉树 C语言实现
- 头像相关
- jsp编码问题
- Android手机暗码大全
- 基于邻接矩阵的广度优先算法
- POJ 1724 ROADS (bfs)
- Matlab摄像头标定得出的参数保存为xml
- java反射(3)在工厂模式中的使用
- C++ 常量const简单总结