重建二叉树(参考剑指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;}