二叉树---前中序数组建立唯一二叉树

2023-11-08 14:59

本文主要是介绍二叉树---前中序数组建立唯一二叉树,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

二叉树的个数


具有n个结点的不同的二叉树有多少种?这与用栈得出的从1到n的数字有多少种不同的排列具有相同的结论。
那么,利用给定了一颗二叉树的前序序列(ABHFDECKG)和中序序列(HBDFAEKCG)能否唯一的确定一颗二叉树?

前序序列中,第一个字母A一定是数的根结点。中序序列中,被划分为两个子序列:((HBDF)A(EKCG)),这样与二叉树第一次近似。
然后,取前序序列的下一个字母B,它出现在A的左子树,应该是A左子树的根,它把中序子序列又划分成两个子序列:((H)B(DF)),A结点的左子树与二叉树近似。
通过下面这张图就可以简单的理解利用前序序列和中序序列建立二叉树的过程。

前序序列(A B H F D E C K G)
中序序列(H B D F A E K C G)
这里写图片描述

代码实现

#include<queue>
#include<iostream>
using namespace std;template<class T>
struct BinTreeNode
{BinTreeNode<T> * _pLeft;BinTreeNode<T> * _pRight;T data;BinTreeNode(const T& data = 0 ):_pLeft(NULL), _pRight(NULL), data(data){}
};
template<class T>
class BinaryTree
{
public://构造函数BinaryTree():_pRoot(NULL){}//利用前序和中序数组,建立唯一二叉树BinTreeNode<T> * CreateBinTree_PreIn(T * VLR, T * LVR, int sz){if (VLR == NULL || LVR == NULL || sz <= 0)return NULL;int i = 0;//便利中序数组下标,找到根结点所在位置while (*VLR != LVR[i]){i++;}BinTreeNode<T> * t = new BinTreeNode<T>(LVR[i]);t->_pLeft = CreateBinTree_PreIn(VLR + 1, LVR, i);t->_pRight = CreateBinTree_PreIn(VLR + i + 1, LVR + i + 1, sz - i - 1);return t;}//前序遍历显示二叉树bool preOrder(BinTreeNode<T> * Node){if (Node == NULL)return false;preOrder(Node->_pLeft);printf("%d", Node->data);preOrder(Node->_pRight);}BinTreeNode<T> * get(){BinTreeNode<T> * ret = _pRoot;return ret;}private:BinTreeNode<T> * _pRoot;
};int main()
{BinaryTree<int>  s;BinTreeNode<int> * pRoot;int a[8] = { 1, 2, 3, 4, 5, 6, 7, 8 };/*s.CreateBinTree_Queue(a,8);pRoot = s.get();s.preOrder(pRoot);*/int VLR[9] = { 1, 2, 4, 8, 9, 5, 3, 6, 7 };int LVR[9] = { 8, 4, 9, 2, 5, 1, 6, 3, 7 };pRoot = s.CreateBinTree_PreIn(VLR, LVR, 9);s.preOrder(pRoot);return 0;
}

这篇关于二叉树---前中序数组建立唯一二叉树的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

如何通过try-catch判断数据库唯一键字段是否重复

《如何通过try-catch判断数据库唯一键字段是否重复》在MyBatis+MySQL中,通过try-catch捕获唯一约束异常可避免重复数据查询,优点是减少数据库交互、提升并发安全,缺点是异常处理开... 目录1、原理2、怎么理解“异常走的是数据库错误路径,开销比普通逻辑分支稍高”?1. 普通逻辑分支 v

Java中数组与栈和堆之间的关系说明

《Java中数组与栈和堆之间的关系说明》文章讲解了Java数组的初始化方式、内存存储机制、引用传递特性及遍历、排序、拷贝技巧,强调引用数据类型方法调用时形参可能修改实参,但需注意引用指向单一对象的特性... 目录Java中数组与栈和堆的关系遍历数组接下来是一些编程小技巧总结Java中数组与栈和堆的关系关于

MySQL逻辑删除与唯一索引冲突解决方案

《MySQL逻辑删除与唯一索引冲突解决方案》本文探讨MySQL逻辑删除与唯一索引冲突问题,提出四种解决方案:复合索引+时间戳、修改唯一字段、历史表、业务层校验,推荐方案1和方案3,适用于不同场景,感兴... 目录问题背景问题复现解决方案解决方案1.复合唯一索引 + 时间戳删除字段解决方案2:删除后修改唯一字

python生成随机唯一id的几种实现方法

《python生成随机唯一id的几种实现方法》在Python中生成随机唯一ID有多种方法,根据不同的需求场景可以选择最适合的方案,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习... 目录方法 1:使用 UUID 模块(推荐)方法 2:使用 Secrets 模块(安全敏感场景)方法

Python通用唯一标识符模块uuid使用案例详解

《Python通用唯一标识符模块uuid使用案例详解》Pythonuuid模块用于生成128位全局唯一标识符,支持UUID1-5版本,适用于分布式系统、数据库主键等场景,需注意隐私、碰撞概率及存储优... 目录简介核心功能1. UUID版本2. UUID属性3. 命名空间使用场景1. 生成唯一标识符2. 数

Java中的数组与集合基本用法详解

《Java中的数组与集合基本用法详解》本文介绍了Java数组和集合框架的基础知识,数组部分涵盖了一维、二维及多维数组的声明、初始化、访问与遍历方法,以及Arrays类的常用操作,对Java数组与集合相... 目录一、Java数组基础1.1 数组结构概述1.2 一维数组1.2.1 声明与初始化1.2.2 访问

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

MySQL JSON 查询中的对象与数组技巧及查询示例

《MySQLJSON查询中的对象与数组技巧及查询示例》MySQL中JSON对象和JSON数组查询的详细介绍及带有WHERE条件的查询示例,本文给大家介绍的非常详细,mysqljson查询示例相关知... 目录jsON 对象查询1. JSON_CONTAINS2. JSON_EXTRACT3. JSON_TA