重建二叉树(参考剑指offer)
来源:互联网 发布:淘宝b2c 编辑:程序博客网 时间:2024/06/06 04:08
题目:由前序和中序,重建二叉树,不含重复的数字
自己重新实现了一遍,在看书的同时,然后自己实现,对自己提升是有帮助的。
本文将从二叉树的构建开始,在此基础上重建二叉树,并写了测试用例,自己实现一遍感觉受益良多
主要代码:
1.头文件:BinaryTree.h
typedef struct BinaryTreeNode{ int value; struct BinaryTreeNode* left; struct BinaryTreeNode* right;}BinaryTreeNode;BinaryTreeNode* CreateBinaryTreeNode(int value);void ConnectTreeNodes(BinaryTreeNode* parent, BinaryTreeNode* left, BinaryTreeNode* right);void PrintTreeNode(BinaryTreeNode* node);void PrintTree(BinaryTreeNode* root);void DestroyTree(BinaryTreeNode* root);
2.头文件的函数实现:BinaryTree.cpp
#include<cstdio>#include"BinaryTree.h"BinaryTreeNode* CreateBinaryTreeNode(int value){ BinaryTreeNode* node = new BinaryTreeNode(); node->value = value; node->left = NULL; node->right = NULL; return node;}void ConnectTreeNodes(BinaryTreeNode* parent, BinaryTreeNode* left, BinaryTreeNode* right){ if(parent != NULL) { parent->left = left; parent->right = right; }}void PrintTreeNode(BinaryTreeNode* node){ if(node != NULL) { printf("value of this node is: %d.\n",node->value); if(node->left != NULL) printf("value of its left child is: %d.\n",node->left->value); else printf("left child is null.\n"); if(node->right != NULL) printf("value of its right child is: %d.\n",node->right->value); else printf("right child is null.\n"); } else { printf("this node is null.\n"); } printf("\n");}void PrintTree(BinaryTreeNode* root){ PrintTreeNode(root); if(root != NULL) { if(root->left != NULL) PrintTreeNode(root->left); if(root->right != NULL) PrintTreeNode(root->right); }}void DestroyTree(BinaryTreeNode* root){ if(root != NULL) { BinaryTreeNode* left = root->left; BinaryTreeNode* right = root->right; delete root; root = NULL; DestroyTree(left); DestroyTree(right); }}
3.重建二叉树:
#include<iostream>#include<cstdio>#include<exception>#include"BinaryTree.h"#include<cstring>using namespace std;BinaryTreeNode* ConstructCore(int *startPreorder, int* endPreorder, int* startInorder, int* endInorder);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 *startPreorder, int *endPreorder, int* startInorder, int* endInorder){ int rootValue = startPreorder[0]; BinaryTreeNode* root = new BinaryTreeNode; root->value = rootValue; root->left = NULL; root->right = NULL; if(startPreorder == endPreorder) { if(startInorder == endInorder && *startPreorder == *startInorder) return root; else printf("Invalid input."); } int *rootInorder = startInorder; while(rootInorder <= endInorder && *rootInorder != rootValue) rootInorder++; if(rootInorder == endInorder && *rootInorder != rootValue) printf("invalid input\n"); int leftLength = rootInorder - startInorder; int* leftPreorderEnd = startPreorder + leftLength; if(leftLength > 0) { root->left = ConstructCore(startPreorder+1, leftPreorderEnd, startInorder, rootInorder-1); } if(leftLength < endPreorder -startPreorder) { root->right = ConstructCore(leftPreorderEnd +1, endPreorder,rootInorder+1,endInorder); } return root;}void Test(char* testName, int* preorder, int* inorder, int length){ if(testName != NULL) printf("%s begins:\n",testName); printf("The preorder sequence is: "); for(int i=0; i<length; i++) printf("%d ", preorder[i]); printf("\n"); printf("The inorder sequence is : "); for(int i=0; i<length; i++) printf("%d ", inorder[i]); printf("\n"); BinaryTreeNode* root = Construct(preorder, inorder, length); PrintTree(root); DestroyTree(root);}void Test1(){ 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}; Test("Test1",preorder, inorder, length);}int main(){ Test1(); return 0;}
- 重建二叉树(参考剑指offer)
- python实现剑指offer系列:重建二叉树
- 剑招offer之重建二叉树
- 剑指offer(5):重建二叉树
- 剑值offer(4)-重建二叉树
- 重建二叉树(剑指offer)
- 剑指offer(四)重建二叉树
- (剑指offer)重建二叉树
- 剑指offer--(4) 重建二叉树
- 剑指offer---重建二叉树(6)
- 剑指Offer(四)重建二叉树
- [剑指offer]重建二叉树
- 【剑指offer】重建二叉树
- 剑指offer--重建二叉树
- 剑指offer---重建二叉树
- 剑指Offer-重建二叉树
- 剑指offer:重建二叉树
- 剑指offer-重建二叉树
- C编译异常集锦
- GlusterFS常用命令小结
- Android解析xml显示乱码问题
- (贪心5.2.10)POJ 3363 Annoying painting tool
- jquery的Validation插件
- 重建二叉树(参考剑指offer)
- UITableViewController
- 在Android adb中显示中文
- linux
- 一位落后生父亲家长会上的演讲
- js的innerHTML及jquery的html() 在ie下不兼容“未知运行时错误” 的解决方案
- Android获取手机和系统版本等信息的代码
- Sizeof运算符
- UIScreen(屏幕)、UIWindow(画框)、UIView(画布)、didFinishLaunchingWithOptions的概念