zoukankan      html  css  js  c++  java
  • 【编程之美】3.9重建二叉树

    题目:

        给定一棵二叉树,假定每个节点都用唯一的字符表示,具体结构如下:

    struct NODE {
      NODE* pLeft;
      NODE* pRight;
      char chValue;
    };

        假设已经有了前序遍历和中序遍历结果,希望通过一个算法重建这棵树。
        给定函数的定义如下:

    void Rebuild(char* pPreOrder, char* pInOrder, int nTreeLen, NODE** pRoot);

        参数
        pPreOrder:前序遍历结果的字符串数组。
        pInOrder: 中序遍历结果的字符串数组。
        nTreeLen: 树的长度。
        pRoot:     根据前序和中序遍历结果重新构建树的根节点。
        例如
        前序遍历结果:a b d c e f
        中序遍历结果:d b a e c f

    思路:不难,根据前序遍历结果找跟,根据中序遍历结果划分左右子树,递归求解。

    /*
    start time = 15:55
    end time = 16:23
    */
    #include<iostream>
    using namespace std;
    
    typedef struct NODE{
        NODE *pLeft, *pRight;
        char chValue;
    }NODE;
    
    void Rebuild(char* pPreOrder, char* pInOrder, int nTreeLen, NODE** pRoot)
    {
        if(pPreOrder == NULL || pInOrder == NULL) //边界条件不要忘了 这是看答案后补上的
        {
            return;
        }
        if(nTreeLen <= 0)
        {
            return;
        }
        //重建根节点 一定是先序遍历的第一个值
        *pRoot = new NODE;
        (*pRoot)->chValue = pPreOrder[0];
        (*pRoot)->pLeft = NULL;
        (*pRoot)->pRight = NULL;
    
        //查找根在中序遍历中的位置,把中序遍历表转化为左子树和右子树两个部分
        int iLocateRoot;
        for(iLocateRoot = 0; iLocateRoot < nTreeLen; iLocateRoot++)
        {
            if(pInOrder[iLocateRoot] == pPreOrder[0])
            {
                break;
            }
        }
    
        //重建左子树
        Rebuild(pPreOrder+1, pInOrder, iLocateRoot, &((*pRoot)->pLeft));
        //重建右子树
        Rebuild(pPreOrder+iLocateRoot+1, pInOrder + iLocateRoot + 1, nTreeLen - iLocateRoot - 1, &((*pRoot)->pRight));
    }
    
    int main()
    {
        char pre[7] = {'a','b','d','c','e','f',''};
        char in[7] = {'d','b','a','e','c','f',''};
        NODE * T = NULL;
        Rebuild(pre, in, 7, &T);
    
        return 0;
    }
  • 相关阅读:
    隐语义模型LFM
    基于内容的推荐、协同过滤
    评定标准
    函数式模型示例
    函数式模型概述
    序贯模型
    seq2seq
    链队列
    顺序栈
    线性表的静态链表存储结构
  • 原文地址:https://www.cnblogs.com/dplearning/p/3995201.html
Copyright © 2011-2022 走看看