zoukankan      html  css  js  c++  java
  • 面试题6:重建二叉树(根据前序和中序)

    面试题6:重建二叉树(根据前序和中序)

    思路:

    根据前序找到root,根据中序分开树的左右子树,然后左右子树各自递归

    树:

    struct BinaryTreeNode 
    {
        int                    m_nValue; 
        BinaryTreeNode*        m_pLeft;  
        BinaryTreeNode*        m_pRight; 
    };

     递归实现

     1 BinaryTreeNode* ConstructCore(int* startPreorder, int* endPreorder, int* startInorder, int* endInorder);
     2 
     3 BinaryTreeNode* Construct(int* preorder, int* inorder, int length)
     4 {
     5     if(preorder == NULL || inorder == NULL || length <= 0)
     6         return NULL;
     7 
     8     return ConstructCore(preorder, preorder + length - 1,
     9         inorder, inorder + length - 1);
    10 }
    11 
    12 BinaryTreeNode* ConstructCore
    13 (
    14     int* startPreorder, int* endPreorder, 
    15     int* startInorder, int* endInorder
    16 )
    17 {
    18     // 前序遍历序列的第一个数字是根结点的值
    19     int rootValue = startPreorder[0];
    20     BinaryTreeNode* root = new BinaryTreeNode();
    21     root->m_nValue = rootValue;
    22     root->m_pLeft = root->m_pRight = NULL;
    23 
    24     if(startPreorder == endPreorder)
    25     {
    26         if(startInorder == endInorder && *startPreorder == *startInorder)
    27             return root;
    28         else
    29             throw std::exception("Invalid input.");
    30     }
    31 
    32     // 在中序遍历中找到根结点的值
    33     int* rootInorder = startInorder;
    34     while(rootInorder <= endInorder && *rootInorder != rootValue)
    35         ++ rootInorder;
    36 
    37     if(rootInorder == endInorder && *rootInorder != rootValue)
    38         throw std::exception("Invalid input.");
    39 
    40     int leftLength = rootInorder - startInorder;
    41     int* leftPreorderEnd = startPreorder + leftLength;
    42     if(leftLength > 0)
    43     {
    44         // 构建左子树
    45         root->m_pLeft = ConstructCore(startPreorder + 1, leftPreorderEnd, 
    46             startInorder, rootInorder - 1);
    47     }
    48     if(leftLength < endPreorder - startPreorder)
    49     {
    50         // 构建右子树
    51         root->m_pRight = ConstructCore(leftPreorderEnd + 1, endPreorder,
    52             rootInorder + 1, endInorder);
    53     }
    54 
    55     return root;
    56 }
  • 相关阅读:
    进制的转换
    输出蛇型矩阵
    输出弓形矩阵
    找出一个数组中出现次数最多的那个元素
    开灯问题
    find your present
    核反应堆
    Box of Bricks最小移动砖块数目
    超级楼梯
    Bootstrap中的 JavaScript 特效 — 下拉菜单和滚动监听插件
  • 原文地址:https://www.cnblogs.com/raichen/p/5632906.html
Copyright © 2011-2022 走看看