重建二叉树
2013-07-12 09:43
267 查看
struct BinaryTreeNode { int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight; }; // 输入:先序和中序的第一个指针和最后一个指针, // 递归调用,每次缺点当前结点 BinaryTreeNode* ConstructCore(int* startPerorder, int* endPreorder, int* startInorder, int* endInorder) { //先序第一个为根节点 int rootValue = startPerorder[0]; BinaryTreeNode* root = new BinaryTreeNode; root->m_nValue = rootValue; root->m_pLeft = root->m_pRight = NULL; //递归退出条件 if ( startPerorder==endPreorder ) { if ( startInorder==endInorder && *startPerorder==*endInorder ) return root; else throw std::exception("Invalid input."); //异常处理 } // 在中序遍历中找到根节点的值 int* rootInorder = startInorder; while(rootInorder<=endInorder && *rootInorder!=rootValue) ++rootInorder; //异常处理 if ( rootInorder==endInorder && *rootInorder!=rootValue) throw std::exception("Invalid input."); int leftLength = rootInorder - startInorder; int* leftPreorderEnd = startPerorder+leftLength; if ( leftLength > 0 ) { //构建左子树 root->m_pLeft = ConstructCore(startPerorder+1,leftPreorderEnd,startInorder, rootInorder-1); } if ( leftLength < endPreorder-startPerorder ) { //构建右子树 root->m_pRight = ConstructCore(leftPreorderEnd+1,endPreorder,rootInorder+1,endInorder); } return root; } //根据先序和中序构建二叉树 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); }
注:本题用递归解,首先得分析好每次递归做的相同事情是什么,其次,判断终止条件;最后,注意边界条件和异常处理。
递归虽然简洁,但它同时也有显著的缺点。
1、递归由于是函数调用自身,而函数调用是有时间和空间消耗的:每一次函数调用,都需要在内存栈中分配空间以保存参数、返回地址及临时变量,而且往栈里面压入数据和弹出数据都需要时间。这就不难理解递归效率不如非递归。
2、递归可能会引起严重的问题:调用栈溢出。前面分析中提到徐哎哟为每一次函数调用在内存栈中分配空间,而每个进程的栈的容量是有限的。递归调用的层级太多时,就会超出栈的容量,从而导致调用栈溢出。
参考:剑指offer
相关文章推荐
- [牛客网,剑指offer,python] 重建二叉树
- LeetCode(Construct Binary Tree from Preorder and Inorder Traversal )根据二叉树的中序遍历和后序遍历重建二叉树
- java-从先序遍历和中序遍历重建二叉树
- 剑指offer(四) 重建二叉树
- 027依据前序遍历和中序遍历,重建二叉树(keep it up)
- 已知二叉树前序遍历和中序遍历的结果,重建二叉树
- 跟我一起学算法系列6---重建二叉树
- 剑指offer《面试题6:重建二叉树》
- 编程之美-先序中序 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 剑指Offer(4)重建二叉树
- 重建二叉树
- 重建二叉树
- 剑指OFFER----重建二叉树
- (C++)剑指offer-4:重建二叉树(理解不透彻)
- 重建二叉树
- 重建二叉树
- 刷题之路----根据前序遍历和中序遍历或者后序遍历和中序遍历重建二叉树