zoukankan      html  css  js  c++  java
  • {面试题6: 重建二叉树}

    From 剑指Offer 何海涛 著

    #include <iostream>
    #include <exception>
    #include <string>
    
    struct BinaryTreeNode {
        int m_nValue;
        BinaryTreeNode *m_pLeft;
        BinaryTreeNode *m_pRight;
    };
    
    BinaryTreeNode* ConstructBinaryTree(const int *preOrder, const int *inOrder, int length) {
        if(preOrder== NULL || inOrder == NULL || length <= 0) {
            return NULL;
        }
        BinaryTreeNode *root = new BinaryTreeNode;
        root->m_nValue = *preOrder;
        const int *rootInOrder = inOrder;
        while(rootInOrder < inOrder+length && *rootInOrder != *preOrder) {
            rootInOrder++;
        }
        if(rootInOrder == inOrder+length) {
            throw std::exception();
        }
        int leftLength = rootInOrder-inOrder;
        root->m_pLeft = ConstructBinaryTree(preOrder+1, inOrder, leftLength);
        root->m_pRight = ConstructBinaryTree(preOrder+leftLength+1, rootInOrder+1, length-leftLength-1);
        return root;
    }

    测试集:

    bool isEqual(const BinaryTreeNode *left, const BinaryTreeNode *right) {
        if(left == NULL && right == NULL) {
            return true;
        }
        if(left != NULL && right != NULL) {
            return left->m_nValue == right->m_nValue && isEqual(left->m_pLeft, right->m_pLeft) && isEqual(left->m_pRight, right->m_pRight);
        }
    }
    
    void FreeBinaryTree(BinaryTreeNode *root) {
        if(root != NULL) {
            FreeBinaryTree(root->m_pLeft);
            FreeBinaryTree(root->m_pRight);
            delete root;
        }
    }
    
    void test(const int *preOrder, const int *inOrder, int length, const BinaryTreeNode *expected) {
        BinaryTreeNode *actual = ConstructBinaryTree(preOrder, inOrder, length);
        std::cout << std::boolalpha << (isEqual(actual, expected)) << std::endl;
        FreeBinaryTree(actual);
    }
    
    int main(int argc, char* argv[]) {
        {
            // 普通二叉树
            //              1
            //           /     
            //          2       3
            //         /       / 
            //        4       5   6
            //                  /
            //          7       8
            int preOrder[] = {1, 2, 4, 7, 3, 5, 6, 8};
            int inOrder[] = {4, 7, 2, 1, 5, 3, 8, 6};
            BinaryTreeNode node8;
            node8.m_nValue = 8;
            node8.m_pLeft = NULL;
            node8.m_pRight = NULL;
            BinaryTreeNode node7;
            node7.m_nValue = 7;
            node7.m_pLeft = NULL;
            node7.m_pRight = NULL;
            BinaryTreeNode node6;
            node6.m_nValue = 6;
            node6.m_pLeft = &node8;
            node6.m_pRight = NULL;
            BinaryTreeNode node5;
            node5.m_nValue = 5;
            node5.m_pLeft = NULL;
            node5.m_pRight = NULL;
            BinaryTreeNode node4;
            node4.m_nValue = 4;
            node4.m_pLeft = NULL;
            node4.m_pRight = &node7;
            BinaryTreeNode node3;
            node3.m_nValue = 3;
            node3.m_pLeft = &node5;
            node3.m_pRight = &node6;
            BinaryTreeNode node2;
            node2.m_nValue = 2;
            node2.m_pLeft = &node4;
            node2.m_pRight = NULL;
            BinaryTreeNode node1;
            node1.m_nValue = 1;
            node1.m_pLeft = &node2;
            node1.m_pRight = &node3;
    
            test(preOrder, inOrder, 8, &node1);
        }
        {
            // 所有结点都没有右子结点
            //            1
            //           /
            //          2
            //         /
            //        3
            //       /
            //      4
            //     /
            //    5
            int preOrder[] = {1, 2, 3, 4, 5};
            int inOrder[] = {5, 4, 3, 2, 1};
            BinaryTreeNode node5;
            node5.m_nValue = 5;
            node5.m_pLeft = NULL;
            node5.m_pRight = NULL;
            BinaryTreeNode node4;
            node4.m_nValue = 4;
            node4.m_pLeft = &node5;
            node4.m_pRight = NULL;
            BinaryTreeNode node3;
            node3.m_nValue = 3;
            node3.m_pLeft = &node4;
            node3.m_pRight = NULL;
            BinaryTreeNode node2;
            node2.m_nValue = 2;
            node2.m_pLeft = &node3;
            node2.m_pRight = NULL;
            BinaryTreeNode node1;
            node1.m_nValue = 1;
            node1.m_pLeft = &node2;
            node1.m_pRight = NULL;
            
            test(preOrder, inOrder, 5, &node1);
        }
        {
            // 所有结点都没有左子结点
            //            1
            //             
            //              2
            //               
            //                3
            //                 
            //                  4
            //                   
            //                    5
            int preOrder[] = {1, 2, 3, 4, 5};
            int inOrder[] = {1, 2, 3, 4, 5};
            BinaryTreeNode node5;
            node5.m_nValue = 5;
            node5.m_pLeft = NULL;
            node5.m_pRight = NULL;
            BinaryTreeNode node4;
            node4.m_nValue = 4;
            node4.m_pLeft = NULL;
            node4.m_pRight = &node5;
            BinaryTreeNode node3;
            node3.m_nValue = 3;
            node3.m_pLeft = NULL;
            node3.m_pRight = &node4;
            BinaryTreeNode node2;
            node2.m_nValue = 2;
            node2.m_pLeft = NULL;
            node2.m_pRight = &node3;
            BinaryTreeNode node1;
            node1.m_nValue = 1;
            node1.m_pLeft = NULL;
            node1.m_pRight = &node2;
    
            test(preOrder, inOrder, 5, &node1);
        }
        {
            // 树中只有一个结点
            int preOrder[] = {1};
            int inOrder[] = {1};
            BinaryTreeNode node1;
            node1.m_nValue = 1;
            node1.m_pLeft = NULL;
            node1.m_pRight = NULL;
            
            test(preOrder, inOrder, 1, &node1);
        }
        {
            // 完全二叉树
            //              1
            //           /     
            //          2       3
            //         /      / 
            //        4   5   6   7
            int preOrder[] = {1, 2, 4, 5, 3, 6, 7};
            int inOrder[ ] = {4, 2, 5, 1, 6, 3, 7};
            BinaryTreeNode node7;
            node7.m_nValue = 7;
            node7.m_pLeft = NULL;
            node7.m_pRight = NULL;
            BinaryTreeNode node6;
            node6.m_nValue = 6;
            node6.m_pLeft = NULL;
            node6.m_pRight = NULL;
            BinaryTreeNode node5;
            node5.m_nValue = 5;
            node5.m_pLeft = NULL;
            node5.m_pRight = NULL;
            BinaryTreeNode node4;
            node4.m_nValue = 4;
            node4.m_pLeft = NULL;
            node4.m_pRight = NULL;
            BinaryTreeNode node3;
            node3.m_nValue = 3;
            node3.m_pLeft = &node6;
            node3.m_pRight = &node7;
            BinaryTreeNode node2;
            node2.m_nValue = 2;
            node2.m_pLeft = &node4;
            node2.m_pRight = &node5;
            BinaryTreeNode node1;
            node1.m_nValue = 1;
            node1.m_pLeft = &node2;
            node1.m_pRight = &node3;
    
            test(preOrder, inOrder, 7, &node1);
        }
        {
            int preOrder[] = {1, 2, 4, 5, 3, 6, 7};
            int inOrder[] = {4, 2, 8, 1, 6, 3, 7};
            try {
                test(preOrder, inOrder, 7, NULL);
            } catch(std::exception& e) {
                std::cout << "true" << std::endl;
            }
        }
        {
            test(NULL, NULL, 0, NULL);
        }
        
        return 0;
        
    }
  • 相关阅读:
    左偏树初识到应用
    Linux用户管理简介
    Linux命令(二十五) 磁盘管理命令(三) fdisk
    Linux命令(二十四) 磁盘管理命令(二) mkfs,mount
    Linux命令(二十三) 磁盘管理命令(一) df,du,tune2fs
    操作系统学习(十四) 、中断描述符表和中断描述符
    操作系统学习(十三) 、中断和异常
    操作系统学习(十二) 、页级保护
    使用Ubuntu编译Linux内核
    操作系统学习(十一) 、一致代码段和非一致代码段
  • 原文地址:https://www.cnblogs.com/long3216/p/4439448.html
Copyright © 2011-2022 走看看