中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java二叉樹怎么根據前序和中序推出后續

發布時間:2021-12-08 14:13:37 來源:億速云 閱讀:163 作者:iii 欄目:大數據

本篇內容介紹了“Java二叉樹怎么根據前序和中序推出后續”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

根據前序跟中序 => 后序

Java二叉樹怎么根據前序和中序推出后續

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
struct BTreeNode
{
    int _value;
    BTreeNode*_left;
    BTreeNode*_right;
};

//解法一
BTreeNode* RebuildCode(int * PreStart, int *PreEnd, int *InStart, int *InEnd)
{
    BTreeNode *root = new BTreeNode();
    //新建節點root保存前序第一個節點為根結點
    root->_value = PreStart[0];
    root-> _left = NULL;
    root->_right  = NULL;
    if(InStart == InEnd && *InStart == *InEnd)
    {
        return root;
    }
    //據此節點找到中序遍歷此節點的位置
    int *rootIn = InStart;
    while(*PreStart != *rootIn)
    {
        rootIn++;
    }
    //左子樹的長度
    int leftlen = rootIn-InStart;
    //重建左子樹
    if(leftlen > 0)
    {
        root->_left = RebuildCode( PreStart+1, PreStart+leftlen, InStart,InStart+leftlen-1);
    }
    //重建右子樹
    if(InStart+leftlen < InEnd)
    {
        root->_right = RebuildCode( PreStart+leftlen+1, PreEnd,InStart+leftlen+1, InEnd);

    }
    return root;
}
BTreeNode* RebuildTree(int *PreOrder, int *InOrder, int len)
{
    //首先判斷邊界條件
    if(PreOrder == NULL || InOrder == NULL || len <= 0)
    {
        return NULL;
    }
    else
    {
        return RebuildCode(PreOrder, PreOrder+len-1, InOrder, InOrder+len-1);
    }
}
//后序遍歷輸出二叉樹序列
void PostOrder(BTreeNode *root)
{
    if(root->_left != NULL)
    {
        PostOrder(root->_left);
    }
     if(root->_right != NULL)
    {
        PostOrder(root->_right);
    }
    if(root != NULL)
    {
        cout<<root->_value<<" ";
    }
}
int main()
{
    int  PreOrder[8] = {1,2,4,7,3,5,6,8};
    int  InOrder[8] = {4,7,2,1,5,3,8,6};
    PostOrder(RebuildTree(PreOrder, InOrder, 8));
    cout<<endl;
    return 0;
}


根據后序跟中序 =>前序

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
struct BTreeNode
{
    int _value;
    BTreeNode*_left;
    BTreeNode*_right;
};

//解法一
BTreeNode* RebuildCode(int * PostStart, int *PostEnd, int *InStart, int *InEnd)
{
    BTreeNode *root = new BTreeNode();
    //新建節點root保存前序第一個節點為根結點
    root->_value = PostEnd[0];
    root-> _left = NULL;
    root->_right  = NULL;
    if(InStart == InEnd && *InStart == *InEnd)
    {
        return root;
    }
    //據此節點找到中序遍歷此節點的位置
    int *rootIn = InStart;
    while(*PostEnd != *rootIn)
    {
        rootIn++;
    }
    //左子樹的長度
    int leftlen = rootIn-InStart;
    //重建左子樹
    if(leftlen > 0)
    {
        root->_left = RebuildCode( PostStart, PostStart+leftlen-1, InStart,InStart+leftlen-1);
    }
    //重建右子樹
    if(InStart+leftlen < InEnd)
    {
        root->_right = RebuildCode( PostStart+leftlen, PostEnd-1, InStart+leftlen+1, InEnd);

    }
    return root;
}
BTreeNode* RebuildTree(int *PostOrder, int *InOrder, int len)
{
    //首先判斷邊界條件
    if(PostOrder == NULL || InOrder == NULL || len <= 0)
    {
        return NULL;
    }
    else
    {
        return RebuildCode(PostOrder, PostOrder+len-1, InOrder, InOrder+len-1);
    }
}
//后序遍歷輸出二叉樹序列
void PreOrder(BTreeNode *root)
{
    if(root != NULL)
    {
        cout<<root->_value<<" ";
    }
    if(root->_left != NULL)
    {
        PreOrder(root->_left);
    }
     if(root->_right != NULL)
    {
        PreOrder(root->_right);
    }
}
int main()
{
    int  PostOrder[8] = {7,4,2,5,8,6,3,1};
    int  InOrder[8] = {4,7,2,1,5,3,8,6};
    PreOrder(RebuildTree(PostOrder, InOrder, 8));
    cout<<endl;
    return 0;
}

“Java二叉樹怎么根據前序和中序推出后續”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

中方县| 三明市| 浏阳市| 崇明县| 蕲春县| 深圳市| 金堂县| 平顶山市| 名山县| 巴南区| 永修县| 汤原县| 岢岚县| 鄂温| 慈利县| 呼伦贝尔市| 娱乐| 新化县| 静宁县| 驻马店市| 新闻| 乐平市| 兴安县| 伊川县| 偃师市| 龙州县| 甘泉县| 五台县| 遂昌县| 利辛县| 寿光市| 安多县| 年辖:市辖区| 新沂市| 肃北| 页游| 奇台县| 青河县| 宜春市| 桦甸市| 新巴尔虎右旗|