IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 【23王道数据结构】根据先序中序(中序后序)建立二叉树,并遍历 -> 正文阅读

[C++知识库]【23王道数据结构】根据先序中序(中序后序)建立二叉树,并遍历

思路
请添加图片描述
已知先序中序

TreeNode* ConstructTree(char pre[], int preStart, int preEnd, char in[], int inStart, int inEnd) {
    if (preStart > preEnd || inStart > inEnd) return NULL;

    TreeNode *root = (TreeNode *) malloc(sizeof (TreeNode));
    root->data = pre[preStart];
    //cout << "Constructor: root->data = " << root->data << endl;

    for (int i = inStart; i <= inEnd; i++) {
        //在中序序列中找到root的值
        if (in[i] == pre[preStart]) {
            //cout << "Constructor: i = " << i<< endl;
            root->lchild = ConstructTree(pre, preStart + 1, preStart + i - inStart,
                                         in, inStart, i - 1);
            root->rchild = ConstructTree(pre, preStart + i - inStart + 1, preEnd,
                                         in, i + 1, inEnd);
        }
    }
    return root;
}

已知后序中序

TreeNode* ConstructTree(char post[], int postStart, int postEnd, char in[], int inStart, int inEnd) {
    if (postStart > postEnd || inStart > inEnd) return NULL;

    TreeNode *root = (TreeNode*) malloc(sizeof (TreeNode));
    root->data = post[postEnd];

    for (int i = inStart; i <= inEnd; i++) {
         if (in[i] == post[postEnd]) {
             root->lchild = ConstructTree(post,postStart,postStart + i - inStart - 1,
                                          in, inStart, i - 1);
             root->rchild = ConstructTree(post, postStart + i - inStart,postEnd - 1,
                                          in, i + 1, inEnd);
         }
    }
    return root;
}

全部代码

//
// 根据前序中序构建二叉树
// Created by 48272 on 2022/4/25.
//
#include <iostream>
#include <cstdlib>
#include <vector>
#include <stack>
#include <queue>

using namespace std;

typedef struct TreeNode{
    char data;
    struct TreeNode *lchild, *rchild;
}TreeNode, *BiTree;

/**
 * pre ABCDEFGHI
 * in BCAEDGHIF
 * @param pre
 * @param preStart
 * @param preEnd
 * @param in
 * @param inStart
 * @param inEnd
 * @return
 */
TreeNode* ConstructTree(char pre[], int preStart, int preEnd, char in[], int inStart, int inEnd);

/**
 * 中序遍历
 * @param root
 * @return
 */
vector<char> inOrder(BiTree root);

/**
 * 层次遍历
 * @param root
 * @return
 */
vector<char> levelOrder(BiTree root);

/**
 * 先序遍历
 * @param root
 * @return
 */
vector<char> preOrder(BiTree root);

int main() {

    char pre[9] = {'A','B','C','D','E','F','G','H','I'};
    char in[9] = {'B','C','A','E','D','G','H','F','I'};



    BiTree root = ConstructTree(pre, 0, 8, in, 0, 8);

    cout << "中序遍历:\n";
    vector<char> inorder =  inOrder(root);
    for (auto &item: inorder) cout << item;
    cout <<endl;

    cout << "层次遍历:\n";
    vector<char> levelorder = levelOrder(root);
    for (auto &item: levelorder) cout << item;
    cout << endl;

    cout << "先序遍历:\n";
    vector<char> preorder = preOrder(root);
    for (auto &item: preorder) cout << item;
    cout << endl;

    return 0;
}


TreeNode* ConstructTree(char pre[], int preStart, int preEnd, char in[], int inStart, int inEnd) {
    if (preStart > preEnd || inStart > inEnd) return NULL;

    TreeNode *root = (TreeNode *) malloc(sizeof (TreeNode));
    root->data = pre[preStart];
    //cout << "Constructor: root->data = " << root->data << endl;

    for (int i = inStart; i <= inEnd; i++) {
        //在中序序列中找到root的值
        if (in[i] == pre[preStart]) {
            //cout << "Constructor: i = " << i<< endl;
            root->lchild = ConstructTree(pre, preStart + 1, preStart + i - inStart,
                                         in, inStart, i - 1);
            root->rchild = ConstructTree(pre, preStart + i - inStart + 1, preEnd,
                                         in, i + 1, inEnd);
        }
    }
    return root;
}

vector<char> preOrder(BiTree root) {
    if (!root) return {};

    vector<char> preorder;

    TreeNode *p = root;
    stack<TreeNode*> s;
    while (p || !s.empty()) {
        // 有左孩子 一直向左走
        if (p) {
            preorder.push_back(p->data);
            s.push(p);
            p = p->lchild;
        }
        else { //否则取出栈顶,找右孩子
            p = s.top();
            s.pop();
            p = p->rchild;
        }
    }
    return preorder;
}

vector<char> inOrder(BiTree root) {
    if (!root) return {};

    vector<char> inorder;

    TreeNode *p = root;
    stack<TreeNode*> s;
    while (p || !s.empty()) {
        // 有左孩子 一直向左走
        if (p) {
            s.push(p);
            p = p->lchild;
        }
        else { //否则取出栈顶,找右孩子
            p = s.top();
            s.pop();
            inorder.push_back(p->data);
            p = p->rchild;
        }
    }
    return inorder;
}

vector<char> levelOrder(BiTree root) {
    if (!root) return {};

    vector<char> levelOrder;
    queue<TreeNode*> level;
    level.push(root);
    while (!level.empty()) {
        TreeNode *t = level.front();
        level.pop();
        levelOrder.push_back(t->data);
        if (t->lchild) level.push(t->lchild);
        if (t->rchild) level.push(t->rchild);
    }
    return levelOrder;
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-27 11:09:20  更:2022-04-27 11:09:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 21:59:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码