一个先序或后序序列 还原唯一 二叉排序树 (C语言实现)
2014-05-06 18:44
471 查看
以下为本人个人观点,如有问题,欢迎指正。
首先是说明,一个先序序列,或者后序序列是否可以确定一个唯一的二叉排序树(BST)
众所周知,1、一个先序或后序序列,与中序序列可以还原一个二叉树。
2、二叉排序树的中序序列为顺序序列,即如果知道先序或后序序列,我们就能推出它的中序序列。
所以,一个先序序列,或者后序序列可以确定一个唯一的二叉排序树(BST)。
还原思路1.根据众所周知2,我们通过先序或或许得到中序,如
先序: 7 5 4 6 9 8 10
中序: 4 5 6 7 8 9 10
已知中序和先序,就与普通还原二叉树方法一样了。
还原思路2.,因为二叉排序树的主要特征是,一个非叶子节点的左子树上所有节点值都比该节点小,而其右子树中的所有节点值都比该节点大。所以对于一个先序序列,
7 5 4 6 9 8 10 我们遍历这个序列,直到找到第一个比a[0]大的节点下标index(这里为比7大的,即值是9,下标为4),
即可确定左子树(1到index-1)与右子树(index到length-1)。
则通过递归,就可还原这个二叉排序树。
思路2代码://写的不好,比较乱,仅供参考,最好自己去实现
首先是说明,一个先序序列,或者后序序列是否可以确定一个唯一的二叉排序树(BST)
众所周知,1、一个先序或后序序列,与中序序列可以还原一个二叉树。
2、二叉排序树的中序序列为顺序序列,即如果知道先序或后序序列,我们就能推出它的中序序列。
所以,一个先序序列,或者后序序列可以确定一个唯一的二叉排序树(BST)。
还原思路1.根据众所周知2,我们通过先序或或许得到中序,如
先序: 7 5 4 6 9 8 10
中序: 4 5 6 7 8 9 10
已知中序和先序,就与普通还原二叉树方法一样了。
还原思路2.,因为二叉排序树的主要特征是,一个非叶子节点的左子树上所有节点值都比该节点小,而其右子树中的所有节点值都比该节点大。所以对于一个先序序列,
7 5 4 6 9 8 10 我们遍历这个序列,直到找到第一个比a[0]大的节点下标index(这里为比7大的,即值是9,下标为4),
即可确定左子树(1到index-1)与右子树(index到length-1)。
则通过递归,就可还原这个二叉排序树。
思路2代码://写的不好,比较乱,仅供参考,最好自己去实现
#include <stdio.h> #include <stdlib.h> struct BinaryTreeNode { int value; BinaryTreeNode *pLeft; BinaryTreeNode *pRight; }; void InOrder(BinaryTreeNode * root) { if(root == NULL) return; InOrder(root->pLeft); printf("%d ", root->value); InOrder(root->pRight); } void RestructBST(BinaryTreeNode * root, const int *preOrderArr, int length) { if(length < 1 || root == NULL || preOrderArr == NULL) return; int leftLength, rightLength; BinaryTreeNode *leftChild = (BinaryTreeNode *) malloc(sizeof (BinaryTreeNode) ); leftChild->value = preOrderArr[0]; leftChild->pLeft = NULL; leftChild->pRight = NULL; root->pLeft = leftChild; int RightChildindex = 0; for(; RightChildindex<length; ++RightChildindex) { if(preOrderArr[RightChildindex] > root->value) break; ++leftLength; } BinaryTreeNode *rightChild = NULL; if(RightChildindex != 0 && RightChildindex < length) { rightChild = (BinaryTreeNode *) malloc(sizeof (BinaryTreeNode)); rightChild->value = preOrderArr[RightChildindex]; rightChild->pLeft = NULL; rightChild->pRight = NULL; root->pRight = rightChild; length--; } --leftLength; rightLength = length - leftLength - 1; RestructBST(leftChild, preOrderArr + 1, leftLength); RestructBST(rightChild, preOrderArr + RightChildindex + 1, rightLength); } int main() { int num = 0; int arr[100]; while(scanf("%d", &num) != EOF) { for(int i=0; i<num; ++i) scanf("%d", &arr[i]); BinaryTreeNode * root = (BinaryTreeNode *) malloc(sizeof (BinaryTreeNode)); root->value = arr[0]; root->pLeft = NULL; root->pRight = NULL; RestructBST(root, arr + 1, num - 1); InOrder(root); free(root); printf("\n"); } return 0; }
相关文章推荐
- 用c语言实现 有一个分数序列 2/1+3/2+5/3+8/5+13/8+… 求出这个数列前20项的和
- <C语言>使用一个二维数组实现学生姓名管理系统,要求不能使用链表
- 用C语言写一个数组,实现类似JAVA语言中ArrayList的功能
- C语言实现一个四叉树quadtree
- C语言实现一个数的二进制位模式从左到右翻转后的值
- 用C语言实现一个简单的HTTP客户端(HTTP Client)
- 个人实现的一个简单的蜗牛矩阵(c语言)
- C语言实现一个泛型容器
- python代码实现:如何反序的迭代一个序列?
- 一个C语言线程池的实现
- 最近根据别人提示的一个想法,东拼西凑,终于实现了android系统中只能看到自己的系统,我称之为唯一系统。 很多企业做设备或是做产品的或是集成商 其中的一部分设备直接用android智能机。担是又不让
- c语言:模拟实现一个输入密码自动取款的程序
- C语言输出一个数二进制序列的奇数位和偶数位
- 如何用C语言获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列
- 用C语言实现一个简单的HTTP客户端(HTTP Client)
- 歌厅歌曲管理系统(转)用c语言实现的一个课程设计
- 利用C语言编程:有一个分数序列 2/1+3/2+5/3+8/5+13/8+...,求此序列前N项和的简单解法,
- 用C语言实现一个简单的计算器代码
- C语言:使用main函数的参数,实现一个整数计算机。
- c语言:有一个分数序列: 2/1+3/2+5/3+8/5+13/8+… 求出这个数列前 20 项的和