重建二叉树

题目:如何根据二叉树的先序遍历和中序遍历结果还原二叉树?比如,先序遍历结果是{1,2,4,7,3,5,6,8},中序遍历结果是{4,7,2,1,5,3,8,6};

 

参考:http://blog.csdn.net/chdjj/article/details/37961347


代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct BinaryTreeNode // a node in the binary tree
{
    int m_nValue; // value of node
    BinaryTreeNode *m_pLeft; // left child of node
    BinaryTreeNode *m_pRight; // right child of node
};
/*说明:T为重建的树,preorder,inorder为 前序和中序,n为长度*/
bool rebuildTree(BinaryTreeNode* &T, int *preorder, int *inorder, int n)
{
    int i;
    bool flag;
    
    if (preorder==NULL || inorder==NULL)
    {
        return false;
    }
    
    /*注意需要判断长度,要返回真*/
    if (n <= 0)
    {
        return true;
    }
    for (i=0; i<n; i++)
    {
        /*分为两部分进行处理*/
        if (inorder[i] == *preorder)
        {
            break;
        }
    }
    if (i >= n)
    {
        return false;
    }
    
    T = (BinaryTreeNode*)malloc(sizeof(BinaryTreeNode));
    T->m_nValue =  *preorder;
    T->m_pLeft = NULL;
    T->m_pRight = NULL;
    
    /*递归建立左子树*/
    flag = rebuildTree(T->m_pLeft, preorder+1, inorder, i);
    if (flag != true)
    {
        return flag;
    }
    /*递归建立右子树*/
    flag = rebuildTree(T->m_pRight, preorder+i+1, inorder+i+1, n-i-1);
    return flag;
}
/*创建二叉树*/
void creatTree(BinaryTreeNode* &bTree, int *a, int pos, int len)
{
     if (pos >= len)
     {
         bTree = NULL;
         return;
     }
     bTree = (BinaryTreeNode*)malloc(sizeof(BinaryTreeNode));
     bTree->m_pLeft = NULL;
     bTree->m_pRight = NULL;
     bTree->m_nValue = a[pos];
     creatTree(bTree->m_pLeft, a, 2*pos+1, len);
     creatTree(bTree->m_pRight, a, 2*pos+2, len);
}
/*先序遍历*/
void preOrderTree(BinaryTreeNode* bTree)
{
    if (bTree == NULL)
    {
        return;
    }
    printf("%d ", bTree->m_nValue);
    preOrderTree(bTree->m_pLeft);
    preOrderTree(bTree->m_pRight);
}
/*中序遍历*/
void inOrderTree(BinaryTreeNode* bTree)
{
    if (bTree == NULL)
    {
        return;
    }
    inOrderTree(bTree->m_pLeft);
    printf("%d ", bTree->m_nValue);
    inOrderTree(bTree->m_pRight);
}
/*后序遍历*/
void postOrderTree(BinaryTreeNode* bTree)
{
    if (bTree == NULL)
    {
        return;
    }
    postOrderTree(bTree->m_pLeft);
    postOrderTree(bTree->m_pRight);
    printf("%d ", bTree->m_nValue);
}
int main()
{
    int a[] = {1,2,4,7,3,5,6,8};
    int b[] = {4,7,2,1,5,3,8,6};
    BinaryTreeNode* bTree = NULL;
    bool flag = rebuildTree(bTree, a, b, 8);
    if (flag == true)
    {
       preOrderTree(bTree);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值