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

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

相关文章

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

vue如何监听对象或者数组某个属性的变化详解

《vue如何监听对象或者数组某个属性的变化详解》这篇文章主要给大家介绍了关于vue如何监听对象或者数组某个属性的变化,在Vue.js中可以通过watch监听属性变化并动态修改其他属性的值,watch通... 目录前言用watch监听深度监听使用计算属性watch和计算属性的区别在vue 3中使用watchE

hdu2241(二分+合并数组)

题意:判断是否存在a+b+c = x,a,b,c分别属于集合A,B,C 如果用暴力会超时,所以这里用到了数组合并,将b,c数组合并成d,d数组存的是b,c数组元素的和,然后对d数组进行二分就可以了 代码如下(附注释): #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<que

hdu 1166 敌兵布阵(树状数组 or 线段树)

题意是求一个线段的和,在线段上可以进行加减的修改。 树状数组的模板题。 代码: #include <stdio.h>#include <string.h>const int maxn = 50000 + 1;int c[maxn];int n;int lowbit(int x){return x & -x;}void add(int x, int num){while

建立升序链表

题目1181:遍历链表 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2744 解决:1186 题目描述: 建立一个升序链表并遍历输出。 输入: 输入的每个案例中第一行包括1个整数:n(1<=n<=1000),接下来的一行包括n个整数。 输出: 可能有多组测试数据,对于每组数据, 将n个整数建立升序链表,之后遍历链表并输出。 样例输

leetcode105 从前序与中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3/ \9 20/ \15 7   class Solution {public TreeNode buildTree(int[] pr

C语言:柔性数组

数组定义 柔性数组 err int arr[0] = {0}; // ERROR 柔性数组 // 常见struct Test{int len;char arr[1024];} // 柔性数组struct Test{int len;char arr[0];}struct Test *t;t = malloc(sizeof(Test) + 11);strcpy(t->arr,