由前序和中序序列构建二叉树

来源:互联网 发布:419什么意思网络语言 编辑:程序博客网 时间:2024/05/12 10:47

根据前序遍历和中序遍历的特点,前序序列的第一个是树的根结点,然后再中序序列中找到根节点,左边为左子树,右边右子树,然后递归建立各个子树。

代码如下:

#include <iostream>#include <algorithm>using namespace std;struct TNode{    int m_val;    TNode* m_left;    TNode* m_right;};TNode* ConstructTree(int *preorderStart, int *preorderEnd,                     int *inorderStart, int *inorderEnd){    int rootVal = *preorderStart;    TNode* root = new TNode();    root->m_val = rootVal;    root->m_left = root->m_right = NULL;    //search for root in inorder    int* rootPos = NULL;    for (rootPos = inorderStart; rootPos <= inorderEnd; rootPos++) {        if (*rootPos == rootVal) {            break;        }    }    if (rootPos > inorderEnd) {        cout << "Wrong data" << endl;    }        if (preorderStart == preorderEnd) {        if (inorderStart == inorderEnd && *preorderStart == * inorderStart) {            return root;        }        else{            cout << "Wrong data" << endl;        }    }        int leftlength = rootPos - inorderStart;    if (leftlength > 0) {        root->m_left = ConstructTree(preorderStart + 1, preorderStart + leftlength, inorderStart, rootPos - 1);    }        if (leftlength < preorderEnd - preorderStart) {        root->m_right = ConstructTree(preorderStart + leftlength + 1, preorderEnd, rootPos + 1, inorderEnd);    }        return root;}TNode* Construct(int* preorder, int* inorder, int length){    if (preorder == NULL || inorder == NULL || length <= 0) {        return NULL;    }        return ConstructTree(preorder, preorder + length - 1, inorder, inorder + length - 1);}int main(int argc, const char * argv[]){    int preorder[] {1, 2, 4, 7, 3, 5, 6, 8};    int inorder[] {4, 7, 2, 1, 5, 3, 8, 6};    TNode* t = Construct(preorder, inorder, 8);    return 0;}


0 0
原创粉丝点击