重建二叉树
来源:互联网 发布:网络骗术有那些 编辑:程序博客网 时间:2024/05/22 11:31
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并输出它的后序遍历序列。
struct BiTreeNode{int data;BiTreeNode *lchild; BiTreeNode *rchild; };//重建二叉树的核心部分BiTreeNode* ConstructCore(int* preorderStart,int* preorderEnd,int* inorderStart,int* inorderEnd){//先新建根节点,保证只有一个点时,直接赋值给根节点int rootValue = preorderStart[0];BiTreeNode* root = new BiTreeNode();root->data = rootValue;root->lchild = root->rchild = NULL;//判断是否只有一个节点if(preorderStart == preorderEnd && inorderStart == inorderEnd)return root;elsethrow std::exception("Invalid input");//在中序中遍历,找到根节点int* inorderRoot = inorderStart;while(inorderRoot <= inorderEnd && *inorderRoot != rootValue)++inorderRoot;//没遍历到最后且值不等于根if(inorderRoot == inorderEnd && *inorderRoot != rootValue)throw std::exception("Invalid input");int leftLen = inorderRoot - inorderStart;//左子树长度int* leftpreorderEnd = preorderStart + leftLen;//之后去前序中递归if(leftLen > 0){//构建左子树root->lchild = ConstructCore(preorderStart + 1,leftpreorderEnd ,inorderStart,inorderRoot -1);//前序中左子树,start+1,到左子树长度,中序中左子树长度,开始到根节点}if(leftLen < preorderEnd - preorderStart )//只要有右子树root->rchild = ConstructCore(leftpreorderEnd + 1,preorderEnd,inorderRoot + 1,inorderEnd);//前序中右子树为,左子树长度+1到末尾,中序中为根+1,到endreturn root;}//BiTreeNode* Construct(int* preorder,int* inorder,int len)//读入前序中序数组{//先判断数组是否为空if(preorder == NULL || inorder == NULL || len < 1)return NULL;return ConstructCore(preorder,preorder + len - 1,inorder,inorder + len - 1);}//后序遍历void Posorder(BiTreeNode* &T){if(T){Posorder(T->lchild);Posorder(T->rchild);cout << T->data;}else cout << " ";}void DestroyTree(BiTreeNode* pRoot){ if(pRoot != NULL) {BiTreeNode* pLeft = pRoot->lchild;BiTreeNode* pRight = pRoot->rchild; delete pRoot; pRoot = NULL; DestroyTree(pLeft); DestroyTree(pRight); }}
0 0
- 3.9重建二叉树
- 重建二叉树
- 二叉树重建
- 二叉树重建
- 二叉树的重建
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 二叉树重建
- 二叉树重建
- 重建二叉树
- 重建二叉树
- 重建二叉树
- POJ 1631 Bridging signals
- 扫描线
- 用css解决table文字溢出控制td显示字数
- 如何让程序只运行一个实例
- c 语言使用ocilib连接 orale数据库
- 重建二叉树
- 显示js对象所有属性和方法的函数
- 你写代码的习惯,决定了你的未来——码农的悲哀
- 树的子结构
- HDOJ题目1701ACMer(数学)
- hdu 2124 Repair the Wall
- unity3d实现发送带附件的邮件
- Yii 1.1: alipay4yii
- 配置文件类