中文字幕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

舟曲县| 彰武县| 金湖县| 台南市| 莲花县| 铜陵市| 吐鲁番市| 安顺市| 屏南县| 贡山| 江安县| 普陀区| 清涧县| 大余县| 延寿县| 德州市| 娄烦县| 大方县| 平湖市| 云阳县| 阿拉尔市| 新平| 新宾| 民丰县| 玉田县| 巴林左旗| 龙井市| 琼海市| 耒阳市| 星子县| 杨浦区| 区。| 资源县| 肇源县| 新平| 扶沟县| 南陵县| 石屏县| 永定县| 阿勒泰市| 都昌县|