剑指offer-面试题7-重建二叉树-二叉树
Posted buaazhhx
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer-面试题7-重建二叉树-二叉树相关的知识,希望对你有一定的参考价值。
/* 题目: 输入二叉树的前序遍历和中序遍历的结果,重建二叉树。假设输入的前序遍历和中序遍历的结果中不包含重复的数字。 */ /* 思路: 使用前序遍历找到根节点,再通过中序遍历找到左子树和右子树。 采用递归的方法建立。 */ struct BinaryTreeNode{ int value; BinaryTreeNode* left; BinaryTreeNode* right } BinaryTreeNode* Construct(int* preOrder,int* Inorder,int length){ if(preOrder == null || Inorder == null || length <= 0){ return null; } return ConstructCore(preOrder,preOrder+length-1,Inorder,Inorder+length-1); } BinaryTreeNode* ConstructCore(int *preOrder,int* endPreOrder,int* inOrder,int *endInOrder){ BinaryTreeNode* root = new BinaryTreeNode(); root->value = *preOrder; root->left = null; root->right = null; if(preOrder == endInOrder){ if(inOrder == endInOrder && preOrder == inOrder){ return root; } else{ throw std::exception("Invalid input"); } } //在中序遍历中找到根节点 int* rootInorder = inOrder; while(rootInorder <= endInOrder && *rootInorder != root->value){ rootInorder++; } int leftLength = rootInorder - inOrder; int *leftPreOrderEnd = preOrder + leftLength; //创建左子树 if(leftLength > 0){ root->left = ConstructCore(preOrder+1,leftPreOrderEnd,inOrder,rootInorder-1); } if(leftLength < endPreOrder - preOrder){ root->right = ConstructCore(leftPreOrderEnd+1,endPreOrder,rootInorder+1,endInOrder); } return root; }
以上是关于剑指offer-面试题7-重建二叉树-二叉树的主要内容,如果未能解决你的问题,请参考以下文章