【23王道数据结构】根据先序中序(中序后序)建立二叉树,并遍历

2024-03-09 15:30

本文主要是介绍【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;
}

这篇关于【23王道数据结构】根据先序中序(中序后序)建立二叉树,并遍历的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/791106

相关文章

MySQL存储过程之循环遍历查询的结果集详解

《MySQL存储过程之循环遍历查询的结果集详解》:本文主要介绍MySQL存储过程之循环遍历查询的结果集,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言1. 表结构2. 存储过程3. 关于存储过程的SQL补充总结前言近来碰到这样一个问题:在生产上导入的数据发现

python进行while遍历的常见错误解析

《python进行while遍历的常见错误解析》在Python中选择合适的遍历方式需要综合考虑可读性、性能和具体需求,本文就来和大家讲解一下python中while遍历常见错误以及所有遍历方法的优缺点... 目录一、超出数组范围问题分析错误复现解决方法关键区别二、continue使用问题分析正确写法关键点三

Java遍历HashMap的6种常见方式

《Java遍历HashMap的6种常见方式》这篇文章主要给大家介绍了关于Java遍历HashMap的6种常见方式,方法包括使用keySet()、entrySet()、forEach()、迭代器以及分别... 目录1,使用 keySet() 遍历键,再通过键获取值2,使用 entrySet() 遍历键值对3,

C#数据结构之字符串(string)详解

《C#数据结构之字符串(string)详解》:本文主要介绍C#数据结构之字符串(string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录转义字符序列字符串的创建字符串的声明null字符串与空字符串重复单字符字符串的构造字符串的属性和常用方法属性常用方法总结摘

Go语言中三种容器类型的数据结构详解

《Go语言中三种容器类型的数据结构详解》在Go语言中,有三种主要的容器类型用于存储和操作集合数据:本文主要介绍三者的使用与区别,感兴趣的小伙伴可以跟随小编一起学习一下... 目录基本概念1. 数组(Array)2. 切片(Slice)3. 映射(Map)对比总结注意事项基本概念在 Go 语言中,有三种主要

C++中使用vector存储并遍历数据的基本步骤

《C++中使用vector存储并遍历数据的基本步骤》C++标准模板库(STL)提供了多种容器类型,包括顺序容器、关联容器、无序关联容器和容器适配器,每种容器都有其特定的用途和特性,:本文主要介绍C... 目录(1)容器及简要描述‌php顺序容器‌‌关联容器‌‌无序关联容器‌(基于哈希表):‌容器适配器‌:(

龙蜥操作系统Anolis OS-23.x安装配置图解教程(保姆级)

《龙蜥操作系统AnolisOS-23.x安装配置图解教程(保姆级)》:本文主要介绍了安装和配置AnolisOS23.2系统,包括分区、软件选择、设置root密码、网络配置、主机名设置和禁用SELinux的步骤,详细内容请阅读本文,希望能对你有所帮助... ‌AnolisOS‌是由阿里云推出的开源操作系统,旨

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)