OpenJudge 由中根顺序和后根序列重建二叉树

【题解】

后根序列的最后一个元素即为二叉树的树根root。root将中根序列分为两部分,左半边是左子树的中根序列,而右半边则是右部分的中根序列。同时后根序列依照左子树和右子树节点数也可以被分为左子树的后根序列和右子树的后根序列。于是便可依此递归地按左右子树的后根、中根序列重建子树,最终重建二叉树。

【代码】

 1 #include <iostream>
 2 using namespace std;
 3 /*build BT from its inorder and postorder*/
 4
 5
 6 constexpr int MAXN = 65540;
 7 int postorder[MAXN], inorder[MAXN];
 8
 9 struct btn
10 {
11     int data;
12     btn *left;
13     btn *right;
14 };
15
16 btn *build_tree(int io1, int io2, int po1, int po2)
17 {
18     /*io1, io2 are the begining and ending points of inorder sequence respectively*/
19     /*po1, po2 are the begining and ending points of postorder sequence respectively*/
20     int i = 0, ion = io2 - io1 + 1;
21     btn* root = new btn;
22     root->data = postorder[po2];
23     root->left = NULL;
24     root->right = NULL;
25     for (i = 0; i < ion; i++) {
26         if (root->data == inorder[io1 + i])break;
27     }
28     if (i > 0) root->left = build_tree(io1, io1 + i - 1, po1, po1 + i - 1);
29     if (io1 + i < io2) root->right = build_tree(io1 + i + 1, io2, po1 + i, po2 - 1);
30     return root;
31 }
32
33 void preorder(btn *root, int vnum, int &count)
34 {
35     if (root != NULL) {
36         cout << root->data;
37         if (count < vnum - 1) {
38             cout << " ";
39             count++;
40             preorder(root->left, vnum, count);
41             preorder(root->right, vnum, count);
42         }
43         else cout << endl;
44     }
45 }
46
47 void deletetree(btn *root)
48 {
49     if (root != NULL) {
50         delete(root->left);
51         delete(root->right);
52         delete root;
53         root = NULL;
54     }
55 }
56
57 int main()
58 {
59     int c = 0, i = 0, vnum = 0;
60     while (cin >> inorder[i++]) {
61         if (cin.get() != ‘ ‘)break;
62         /*Alththough cin will skip the blank space, the cursor stays at the blank after cin reads a number,thus cin.get() can fetch the
63         blank space.*/
64     }
65
66     vnum = i;
67     i = 0;
68     while (cin >> postorder[i++]) {
69         if (cin.get() != ‘ ‘)break;
70     }
71     btn *root = build_tree(0, i - 1, 0, i - 1);
72     preorder(root, vnum, c);
73     deletetree(root);
74     return 0;
75 }

原文地址:https://www.cnblogs.com/Jeffrey-Y/p/9968465.html

时间: 2024-07-28 18:14:00

OpenJudge 由中根顺序和后根序列重建二叉树的相关文章

根据前序和中序列 重建二叉树

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并输出它的后序遍历序列. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入的第一行为一个整数n(1<=n<=1000):代表二叉树的节点个数. 输入的第二行包括n个整数(其中每个元素a的范围为(1<=a<=1000)):代表二叉树的前序遍历序列.

通过先序遍历和中序遍历后的序列还原二叉树

当我们有一个 先序遍历序列:1,3,7,9,5,11 中序遍历序列:9,7,3,1,5,11 我们可以很轻松的用笔写出对应的二叉树.但是用代码又该如何实现? 下面我们来简单谈谈基本思想. 首先,先序遍历的顺序是根据 根-左孩子-右孩子 的顺序遍历的,那么我们可以率先确认的是先序遍历序列的第一个数就是根节点,然后中序遍历是根据 左孩子-根-右孩子 的顺序遍历的.我们通过先序遍历确认了根节点,那么我们只需要在中序遍历中找到根节点的位置,然后就可以很好地区分出,那些属于左子树的节点,那些是属于右子树的

依据前序和中序列 重建二叉树

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.如果输入的前序遍历和中序遍历的结果中都不含反复的数字.比如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6}.则重建二叉树并输出它的后序遍历序列. 输入: 输入可能包括多个測试例子.对于每一个測试案例, 输入的第一行为一个整数n(1<=n<=1000):代表二叉树的节点个数. 输入的第二行包含n个整数(当中每一个元素a的范围为(1<=a<=1000)):代表二叉树的前序遍历序列

剑指Offer 通过中序和先序遍历重建二叉树

题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. 思路: 写一个reConstruct函数4个形参,分别记录子树前序开始结束的位置,中序开始结束的位子.每次在中序中将前序的根节点找出,讲中序分为前(左子树),后(右子树)2 个部分.递归,直到,子树的开始位置大于结束位置. AC代码: 1 /** 2

Tree Recovery(由先、中序列构建二叉树)

题目来源: http://poj.org/problem?id=2255 题目描述: Description Little Valentine liked playing with binary trees very much. Her favorite game was constructing randomly looking binary trees with capital letters in the nodes. This is an example of one of her cr

二叉树(14)----由前序遍历和中序遍历重建二叉树

1.二叉树定义 typedef struct BTreeNodeElement_t_ { void *data; } BTreeNodeElement_t; typedef struct BTreeNode_t_ { BTreeNodeElement_t *m_pElemt; struct BTreeNode_t_ *m_pLeft; struct BTreeNode_t_ *m_pRight; } BTreeNode_t; 二.根据前序遍历序列和中序遍历序列重建二叉树 算法说明: 由中序遍历序

根据先中序序列或后中序序列确定二叉树

/* Name: 根据先中序序列或后中序序列确定二叉树 Copyright: Author: 巧若拙 Date: 03-10-14 11:25 Description: 根据先中序序列或后中序序列确定二叉树,各种顺序遍历二叉树检查结果. 根据先中序序列生成二叉树:从先序序列中找到二叉树(或者子树)的根结点,然后在中序序列找到该根结点, 根结点将中序序列分成左右两部分,左边为左子树,右边为右子树. 根据中序序列确定左子树的长度,确定左子树中最右下结点在先序序列中的位置, 从而可以确定左右子树在先中

根据先序和中序序列构建二叉树

说明: 本次实验利用中序和先序序列,采用递归方式来构建二叉树 . 经过几天的失败和思考,我认为递归构建二叉树的过程中最重要的是递归单元,最麻烦的是递归参数的选择和传递. 简单将算法过程用如下流程图来表示:(本帖所用算法及图片均为原创内容,转贴注明出处) 算法:1.根据先序序列,建立根结点T 2.寻找中序序列的根结点位置,并据此位置计算左子树和右子树的区间 3.判断l_start和r_end是否相等,相等则表示只有一个根结点,设置其左右孩子结点为空并结束这一层:若不相等则继续下面步骤: 4.根据2

Excel中拖放填充与自定义序列

记得刚用excel的时候,对填充功能还不甚了解,以至于做过对相邻挨个单元格粘贴相同公式,然后再更改单元格引用的傻事.自从知道了填充后,往下一拖相应的公式和单元格引用就都做好了.运用填充和序列,虽然不是什么受人顶礼膜拜的技能,但熟练掌握确实可以提高工作效率. 注意数值型需要提供前两个数据,其他类型只要提供前一个数据即可,而且并不需要从序列的第一个数据开始输入.另外除了拖动填充柄还可以双击填充柄进行填充. 当你在一个单元格输不同类型的数据,然后进行拖放,excel会产生不同的效果,比如你在A1输入一