剑指offer-->面试题6 重建二叉树
2013-02-08 13:29
507 查看
下面是源代码:
#include <stdio.h> struct BinaryTreeNode { int m_nValue; BinaryTreeNode *m_pLeft; BinaryTreeNode *m_pRight; }; BinaryTreeNode *ConstructCore(int *startPreorder, int *endPreorder, int *startInorder, int *endInorder) { int rootValue = startPreorder[0]; BinaryTreeNode *root = new BinaryTreeNode(); root->m_nValue = rootValue; root->m_pLeft = NULL; root->m_pRight = NULL; //递归结束条件,当只剩节点时 if(startPreorder == endPreorder) { if(startInorder == endInorder && *startPreorder == *startInorder) { return root; }else { return NULL; } } int *rootInorder = startInorder; while(rootInorder <= endInorder && *rootInorder != rootValue) { rootInorder++; } if(rootInorder > endInorder) { printf("无效的输入\n"); } int leftLength = rootInorder - startInorder; int rightLength = endInorder - rootInorder; if(leftLength > 0) { root->m_pLeft = ConstructCore(startPreorder + 1, startPreorder + leftLength, startInorder, startInorder + leftLength - 1); } if(rightLength > 0) { root->m_pRight = ConstructCore(startPreorder + leftLength + 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); } void PrintTreeNode(BinaryTreeNode* pNode) { if(pNode != NULL) { printf("value of this node is: %d\n", pNode->m_nValue); if(pNode->m_pLeft != NULL) printf("value of its left child is: %d.\n", pNode->m_pLeft->m_nValue); else printf("left child is null.\n"); if(pNode->m_pRight != NULL) printf("value of its right child is: %d.\n", pNode->m_pRight->m_nValue); else printf("right child is null.\n"); } else { printf("this node is null.\n"); } printf("\n"); } void PrintTree(BinaryTreeNode* pRoot) { PrintTreeNode(pRoot); if(pRoot != NULL) { if(pRoot->m_pLeft != NULL) PrintTree(pRoot->m_pLeft); if(pRoot->m_pRight != NULL) PrintTree(pRoot->m_pRight); } } void DestroyTree(BinaryTreeNode* pRoot) { if(pRoot != NULL) { BinaryTreeNode* pLeft = pRoot->m_pLeft; BinaryTreeNode* pRight = pRoot->m_pRight; delete pRoot; pRoot = NULL; DestroyTree(pLeft); DestroyTree(pRight); } } void main() { const int length = 8; int preorder[length] = {1, 2, 4, 7, 3, 5, 6, 8}; int inorder[length] = {4, 7, 2, 1, 5, 3, 8, 6}; BinaryTreeNode *root = Construct(preorder, inorder, length); PrintTree(root); DestroyTree(root); }
下面是运行结果:
相关文章推荐
- <剑指offer 面试题7-2>重建二叉树 Java
- 剑指offer-->面试题7 用两个栈实现队列
- 剑指Offer面试题6:重建二叉树 Java实现
- 【剑指offer】面试题六:重建二叉树
- 剑指Offer面试题6(Java版):重建二叉树
- 剑指Offer面试题7:重建二叉树
- 剑指offer--面试题6:重建二叉树--Java实现
- 剑指offer 面试题6 重建二叉树
- 剑指offer--面试题6 重建二叉树
- 剑指Offer之面试题6:重建二叉树
- 【剑指Offer面试题】 九度OJ1385:重建二叉树
- 【剑指offer】面试题 7:重建二叉树
- 剑指offer 面试题6 重建二叉树 java版答案
- 剑指Offer_面试题39_二叉树的深度 & 判断平衡二叉树
- 剑指offer面试题6——重建二叉树(递归)
- 【剑指Offer面试题】 九度OJ1385:重建二叉树
- 剑指offer 面试题6:重建二叉树(Leetcode105. Construct Binary Tree from Preorder and Inorder Traversal) 解题报告
- 剑指offer-->面试题5 从尾到头打印链表
- 剑指Offer_面试题06_重建二叉树