zoukankan      html  css  js  c++  java
  • 练习题

    重建二叉树
    //
    题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。 #include <iostream> #include <exception> //二叉树结构体 struct BinaryTreeNode{ int value;// BinaryTreeNode *pLeft;// BinaryTreeNode *pRight;// }; //打印二叉树 void PrintTreeNode(const BinaryTreeNode*pNode) { if (pNode != nullptr) { printf("value of this node is : %d ", pNode->value); if (pNode->pLeft != nullptr) { printf("value of its left child is : %d ", pNode->pLeft->value); } else{ printf("left child is nullptr... "); } if (pNode->pRight != nullptr) { printf("value of its right child is : %d ", pNode->pRight->value); } else{ printf("right child is nullptr... "); } } else{ printf("this node is nullptr... "); } printf(" "); } void PrintTree(const BinaryTreeNode* pRoot) { PrintTreeNode(pRoot); if (pRoot != nullptr) { if (pRoot->pLeft != nullptr) PrintTree(pRoot->pLeft); if (pRoot->pRight != nullptr) PrintTree(pRoot->pRight); } } //销毁二叉树 void DestroyTree(BinaryTreeNode* pRoot) { if (pRoot != nullptr) { BinaryTreeNode* pLeft = pRoot->pLeft; BinaryTreeNode* pRight = pRoot->pRight; delete pRoot; pRoot = nullptr; DestroyTree(pLeft); DestroyTree(pRight); } } BinaryTreeNode* ConstructCore(int* startPreorder, int* endPreorder, int* startInorder, int* endInorder) { int rootValue = startPreorder[0];//前序遍历第一个节点是根节点 BinaryTreeNode* root = new BinaryTreeNode(); root->value = rootValue; root->pLeft = nullptr; root->pRight = nullptr; if (startPreorder == endPreorder) //只有一个根节点 { if ((startInorder == endInorder) && (startPreorder[0] == startInorder[0])) { return root; } else{ throw std::exception("Invalid input...111111"); } } //从中序遍历中寻找根节点,左边为根节点的左子树,右边为根节点的右子树 int* rootInorde = startInorder; while (rootInorde <= endInorder && (*rootInorde != rootValue)) { rootInorde++; } if (rootInorde == endInorder && (*rootInorde != rootValue))//中序遍历完,没有找到根节点的值 { throw std::exception("Invalid input...222222"); } int leftLength = rootInorde - startInorder;//中序遍历中,根节点左边有多少个元素(左子树) int* leftPreorderEnd = startPreorder + leftLength; if (leftLength > 0) { root->pLeft = ConstructCore(startPreorder + 1, leftPreorderEnd, startInorder, rootInorde - 1); } if (leftLength < endPreorder - startPreorder) { root->pRight = ConstructCore(leftPreorderEnd + 1, endPreorder, rootInorde + 1, endInorder); } return root; } // ============================测试代码========================== int Test(char* testName, int*preorder, int*inorder, int length) { if (preorder == nullptr || inorder == nullptr || length <= 0) { std::cout << "input error..." << std::endl; return 1; } if (testName != nullptr) { std::cout << testName << " begins: "; } std::cout << "The preorder sequence is:" << std::endl; for (int i = 0; i < length; i++) { std::cout << preorder[i] << " "; } std::cout << std::endl; std::cout << "The inorder sequence is:" << std::endl; for (int i = 0; i < length; i++) { std::cout << inorder[i] << " "; } std::cout << std::endl; //调用重建函数 BinaryTreeNode* root = ConstructCore(preorder, preorder + length - 1, inorder, inorder + length - 1); PrintTree(root); DestroyTree(root); return 0; } 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); } void 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); } int main() { Test1(); }

    从尾到头打印链表

    #include <iostream>
    #include <stack>
    using namespace std;
    
    struct ListNode{
        int value;
        struct ListNode* pNext;
    };
    
    void PrintListReversinglyIteratively(ListNode* pHead)
    {
        stack<ListNode*> nodes;
        ListNode* pNode = pHead;
        while (pNode != nullptr)
        {
            nodes.push(pNode);
            pNode = pNode->pNext;
        }
    
        //输出栈
        while (!nodes.empty())
        {
            pNode = nodes.top();//取出栈顶元素
            cout << "value=" << pNode->value << ", ";
            nodes.pop();//弹出栈顶元素
        }
    }
    
    //方法二:递归法
    void PrintListReversinglyRecursively(ListNode* pHead)
    {
        if (pHead != nullptr)
        {
            if (pHead->pNext != nullptr)
            {
                PrintListReversinglyRecursively(pHead->pNext);
            }
            cout << "value=" << pHead->value << ",";
        }
    }
    
    //打印链表
    void PrintList(ListNode* pHead)
    {
        cout << "print list starts...
    " << endl;
    
        ListNode* pNode = pHead;
        while (pNode != nullptr)
        {
            cout << "print list value=" << pNode->value << endl;
            pNode = pNode->pNext;
        }
        cout << "print list ends...
    " << endl;
    }
    
    ListNode* CreateListNode(int value)
    {
        ListNode* pNode = new ListNode();
        pNode->value = value;
        pNode->pNext = nullptr;
        return pNode;
    }
    
    void ConnectListNodes(ListNode* pCurrent, ListNode* pNext)
    {
        if (pCurrent == nullptr)
        {
            cout << "error to connect two nodes" << endl;
            exit(-1);
        }
        pCurrent->pNext = pNext;
    }
    
    void DestroyList(ListNode* pHead)
    {
        ListNode* pNode = pHead;
        while (pNode != nullptr)
        {
            pHead = pHead->pNext;
            delete pNode;
            pNode = pHead;
        }
    }
    
    // ====================测试代码====================
    void Test(ListNode* pHead)
    {
        PrintList(pHead);
        PrintListReversinglyIteratively(pHead);
        printf("
    
    ");
        PrintListReversinglyRecursively(pHead);
    }
    
    void Test1()
    {
        cout << endl << "Test1 begins..." << endl;
        ListNode* pNode1 = CreateListNode(1);
        ListNode* pNode2 = CreateListNode(2);
        ListNode* pNode3 = CreateListNode(3);
        ListNode* pNode4 = CreateListNode(4);
        ListNode* pNode5 = CreateListNode(5);
    
        ConnectListNodes(pNode1, pNode2);
        ConnectListNodes(pNode2, pNode3);
        ConnectListNodes(pNode3, pNode4);
        ConnectListNodes(pNode4, pNode5);
    
        Test(pNode1);
        DestroyList(pNode1);
    }
    
    int main()
    {
        Test1();
        return 0;
    }
  • 相关阅读:
    鼠标放上面有提示
    js-行事件
    angularjs----实现切换,显示隐藏,选中一行不是table
    [2015-10-28]点击隐藏和显示-jquery和样式
    [2015-10-28]Angularjs-----数据获取,关联
    [2015-10-28]表格排序----question
    [2015-10-27]前端导出excel
    Kafka设计解析(一)- Kafka背景及架构介绍
    JAVA加解密
    kafka入门
  • 原文地址:https://www.cnblogs.com/crazybird123/p/14873623.html
Copyright © 2011-2022 走看看