【面试题六】重建二叉树

来源:互联网 发布:刷票软件 微信安卓 编辑:程序博客网 时间:2024/05/29 16:19

重建二叉树


在前序遍历和中序遍历两个序列中,确定了根结点的值,进而分别找到了左右子树对应的序列;



ConstructBinaryTree.cpp:

#include <iostream>#include "BinaryTree.h"#include <exception>#include <cstdio>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->m_nValue = rootValue;    root->m_pLeft = root->m_pRight = NULL;    if(startPreorder == endPreorder)    {        if(startInorder == endInorder && *startPreorder == *startInorder)            return root;        else            throw std::exception();    }    // 在中序遍历中找到根结点的值    int* rootInorder = startInorder;    while(rootInorder <= endInorder && *rootInorder != rootValue)        ++ rootInorder;    if(rootInorder == endInorder && *rootInorder != rootValue)        throw std::exception();    int leftLength = rootInorder - startInorder;    int* leftPreorderEnd = startPreorder + leftLength;    if(leftLength > 0)    {        // 构建左子树        root->m_pLeft = ConstructCore(startPreorder + 1, leftPreorderEnd,             startInorder, rootInorder - 1);    }    if(leftLength < endPreorder - startPreorder)    {        // 构建右子树        root->m_pRight = 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");    try    {        BinaryTreeNode* root = Construct(preorder, inorder, length);        PrintTree(root);        DestroyTree(root);    }    catch(std::exception& exception)    {        printf("Invalid Input.\n");    }}// 普通二叉树//              1//           /     \//          2       3  //         /       / \//        4       5   6//         \         ///          7       8void 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);}// 所有结点都没有右子结点//            1//           / //          2   //         / //        3 //       ///      4//     ///    5void Test2(){    const int length = 5;    int preorder[length] = {1, 2, 3, 4, 5};    int inorder[length] = {5, 4, 3, 2, 1};    Test("Test2", preorder, inorder, length);}// 所有结点都没有左子结点//            1//             \ //              2   //               \ //                3 //                 \//                  4//                   \//                    5void Test3(){    const int length = 5;    int preorder[length] = {1, 2, 3, 4, 5};    int inorder[length] = {1, 2, 3, 4, 5};    Test("Test3", preorder, inorder, length);}// 树中只有一个结点void Test4(){    const int length = 1;    int preorder[length] = {1};    int inorder[length] = {1};    Test("Test4", preorder, inorder, length);}// 完全二叉树//              1//           /     \//          2       3  //         / \     / \//        4   5   6   7void Test5(){    const int length = 7;    int preorder[length] = {1, 2, 4, 5, 3, 6, 7};    int inorder[length] = {4, 2, 5, 1, 6, 3, 7};    Test("Test5", preorder, inorder, length);}// 输入空指针void Test6(){    Test("Test6", NULL, NULL, 0);}// 输入的两个序列不匹配void Test7(){    const int length = 7;    int preorder[length] = {1, 2, 4, 5, 3, 6, 7};    int inorder[length] = {4, 2, 8, 1, 6, 3, 7};    Test("Test7: for unmatched input", preorder, inorder, length);}int main(){    Test1();    Test2();    Test3();    Test4();    Test5();    Test6();    Test7();    return 0;}


BinaryTree.h:

#ifndef _BINARY_TREE_H_#define _BINARY_TREE_H_struct BinaryTreeNode {    int                    m_nValue;     BinaryTreeNode*        m_pLeft;      BinaryTreeNode*        m_pRight; };BinaryTreeNode* CreateBinaryTreeNode(int value);void ConnectTreeNodes(BinaryTreeNode* pParent, BinaryTreeNode* pLeft, BinaryTreeNode* pRight);void PrintTreeNode(BinaryTreeNode* pNode);void PrintTree(BinaryTreeNode* pRoot);void DestroyTree(BinaryTreeNode* pRoot);#endif /*_BINARY_TREE_H_*/


BinaryTree.cpp:

#include <iostream>#include <cstdio>#include "BinaryTree.h"using namespace std;BinaryTreeNode* CreateBinaryTreeNode(int value){    BinaryTreeNode* pNode = new BinaryTreeNode();    pNode->m_nValue = value;    pNode->m_pLeft = NULL;    pNode->m_pRight = NULL;    return pNode;}void ConnectTreeNodes(BinaryTreeNode* pParent, BinaryTreeNode* pLeft, BinaryTreeNode* pRight){    if(pParent != NULL)    {        pParent->m_pLeft = pLeft;        pParent->m_pRight = pRight;    }}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);    }}


Makefile:

.PHONY:cleanCPP=g++CFLAGS=-Wall -gBIN=testOBJS=ConstructBinaryTree.o BinaryTree.oLIBS=$(BIN):$(OBJS)$(CPP) $(CFLAGS) $^ -o $@ $(LIBS)%.o:%.cpp$(CPP) $(CFLAGS) -c $< -o $@clean:rm -f *.o $(BIN)


运行结果:

Test1 begins:The preorder sequence is: 1 2 4 7 3 5 6 8 The inorder sequence is: 4 7 2 1 5 3 8 6 value of this node is: 1value of its left child is: 2.value of its right child is: 3.value of this node is: 2value of its left child is: 4.right child is null.value of this node is: 4left child is null.value of its right child is: 7.value of this node is: 7left child is null.right child is null.value of this node is: 3value of its left child is: 5.value of its right child is: 6.value of this node is: 5left child is null.right child is null.value of this node is: 6value of its left child is: 8.right child is null.value of this node is: 8left child is null.right child is null.Test2 begins:The preorder sequence is: 1 2 3 4 5 The inorder sequence is: 5 4 3 2 1 value of this node is: 1value of its left child is: 2.right child is null.value of this node is: 2value of its left child is: 3.right child is null.value of this node is: 3value of its left child is: 4.right child is null.value of this node is: 4value of its left child is: 5.right child is null.value of this node is: 5left child is null.right child is null.Test3 begins:The preorder sequence is: 1 2 3 4 5 The inorder sequence is: 1 2 3 4 5 value of this node is: 1left child is null.value of its right child is: 2.value of this node is: 2left child is null.value of its right child is: 3.value of this node is: 3left child is null.value of its right child is: 4.value of this node is: 4left child is null.value of its right child is: 5.value of this node is: 5left child is null.right child is null.Test4 begins:The preorder sequence is: 1 The inorder sequence is: 1 value of this node is: 1left child is null.right child is null.Test5 begins:The preorder sequence is: 1 2 4 5 3 6 7 The inorder sequence is: 4 2 5 1 6 3 7 value of this node is: 1value of its left child is: 2.value of its right child is: 3.value of this node is: 2value of its left child is: 4.value of its right child is: 5.value of this node is: 4left child is null.right child is null.value of this node is: 5left child is null.right child is null.value of this node is: 3value of its left child is: 6.value of its right child is: 7.value of this node is: 6left child is null.right child is null.value of this node is: 7left child is null.right child is null.Test6 begins:The preorder sequence is: The inorder sequence is: this node is null.Test7: for unmatched input begins:The preorder sequence is: 1 2 4 5 3 6 7 The inorder sequence is: 4 2 8 1 6 3 7 Invalid Input.


原创粉丝点击