二叉树——前序和中序得到后序

article/2025/9/17 15:58:20

由二叉树的前序和中序如何得到二叉树的后序呢?要给出答案,首先得明白什么是前序、中序、后序。

二叉树前序:遍历顺序为,根节点、左子树、右子树;中序:遍历顺序为,左子树、根节点、右子树;后序:遍历顺序为,左子树、右子树、根节点

可以发现,二叉树前序中的第一个节点为树的根节点root,然后找出root在中序里面的位置,就可以把前序和中序分别划分为左、右子树两个部分,然后递归调用即可。

举个例子,前序 5 3 2 4 8 6 10 中序 2 3 4 5 6 8 10

首先,5肯定是二叉树的根节点,然后5在中序里面的位置是3号(从0开始),此位置前面的是左子树中的节点,右面的是右子树的节点,即5 || 3 2 4 || 8 2 6 , 2 3 4 || 5 || 6 8 10,对红色的左子树序列、蓝色的右子树序列继续上述过程,直至结束。

由后序和中序求前序也是像类似的思想。但是仅仅知道前序和后序无法确定二叉的形状。比如前序 1 2 3 后序 3 2 1 则下面两种情况都符合

附二叉树前序和中序生成后序的代码

 1 //二叉树 前序和中序得到后序2 #include <stdio.h>3 typedef struct node4 {5     int key;6     struct node *left;7     struct node *right;8 }treeNode;9 
10 int pre_order[100];
11 int mid_order[100];
12 
13 treeNode* construct_post_order(int pre_l, int pre_r, int mid_l, int mid_r)
14 {
15     if (pre_r - pre_l < 0)
16     {
17         return NULL;
18     }
19     treeNode *root;
20     root = new treeNode;
21     root->key = pre_order[pre_l];
22     if (pre_r == pre_l)
23     {
24         root->left = NULL;
25         root->right = NULL;
26         return root;
27     }
28     int index;
29     for (index = mid_l; index <= mid_r; index++)
30     {
31         if (mid_order[index] == pre_order[pre_l])
32             break;
33     }
34     root->left = construct_post_order(pre_l+1, pre_l+(index-mid_l), mid_l, index-1);
35     root->right = construct_post_order(pre_l+(index-mid_l)+1, pre_r, index+1, mid_r);
36     return root;
37 }
38 
39 void post_Order(treeNode *root)
40 {
41     if(root != NULL)
42     {
43         post_Order(root->left);
44         post_Order(root->right);
45         printf("%d ", root->key);
46     }
47 }
48 
49 int main()
50 {
51     int n;
52     printf("输入序列的长度\n");
53     scanf("%d", &n);
54     printf("输入二叉树前序\n");
55     for (int i = 0; i < n; i++)
56         scanf("%d", &pre_order[i]);
57     printf("输入二叉树中序\n");
58     for (int i = 0; i < n; i++)
59         scanf("%d", &mid_order[i]);
60     treeNode *root = construct_post_order(0, n-1, 0, n-1);
61     printf("二叉树的后序为\n");
62     post_Order(root);
63     printf("\n");
64     scanf("%d", &n);
65 
66     return 0;
67 }

http://chatgpt.dhexx.cn/article/MDg4G2Xy.shtml

相关文章

二叉树的遍历|前序、中序、后序、层序遍历

文章目录 6.8 遍历二叉树6.8.1 二叉树遍历原理6.8.2 二叉树遍历方法1&#xff0e;前序遍历2&#xff0e;中序遍历3&#xff0e;后序遍历4&#xff0e;层序遍历 6.8.3 前序遍历算法6.8.4 中序遍历算法6.8.5 后序遍历算法6.8.6 推导遍历结果 6.8 遍历二叉树 6.8.1 二叉…

前序遍历二叉树

package cm.com.algorithm.tree;/*** 前序遍历2叉树* 前序遍历是指&#xff0c;对于树中的任意节点来说&#xff0c;先打印这个节点&#xff0c;然后再打印它的左子树&#xff0c;最后打印它的右子树** author liushuai13meicai.cn* date 2019-06-11 22:14*/ public class DLRT…

java根据前序和中序建树_Java实现根据前序遍历构建二叉树(前序遍历、中序遍历、后序遍历)...

Java实现根据前序遍历构建二叉树(前序遍历、中序遍历、后序遍历)&#xff0c;Java关于ACM的代码真的好少&#xff0c;想参考如何用java实现二叉树googl 前言 Java关于ACM的代码真的好少&#xff0c;想参考如何用java实现二叉树google了一上午都没找到资料&#xff0c;只能自己仿…

C实现前序遍历二叉树

1. 实验目的 &#xff08;1&#xff09;掌握二叉树的逻辑结构&#xff1b; &#xff08;2&#xff09;掌握二叉树的二叉链表存储结构&#xff1b; &#xff08;3&#xff09;验证二叉树的二叉链表存储及遍历操作。 2. 实验目的 &#xff08;1&#xff09;建立一棵含有n个结…

前序序列创建二叉树

7-9 前序序列创建二叉树 &#xff08;25 分&#xff09; 编一个程序&#xff0c;读入用户输入的一串先序遍历字符串&#xff0c;根据此字符串建立一个二叉树&#xff08;以二叉链表存储&#xff09;。 例如如下的先序遍历字符串&#xff1a; ABC##DE#G##F### 其中“#”表示的是…

按照前序遍历创建二叉树及树的四种遍历方式

一.二叉树的介绍 二叉树的特点是二叉树的每个结点的度都不大于2&#xff0c;可以视为每个结点都有左孩子和右孩子。故二叉树结点的数据结构为 二.二叉树的特点 1.设根结点所在的层数为第1层&#xff0c;则第i层最多有个结点。 2.深度为k的二叉树最多有个结点。 3.对任何一个二叉…

LeetCode 144. 二叉树的前序遍历(前序遍历)

文章目录 1. 题目信息2. 解题2.1 递归2.2 循环&#xff0c;必须掌握 1. 题目信息 给定一个二叉树&#xff0c;返回它的 前序 遍历。 示例:输入: [1,null,2,3] 1\2/3 输出: [1,2,3]进阶: 递归算法很简单&#xff0c;你可以通过迭代算法完成吗&#xff1f; 来源&#xff1a;力…

589. N 叉树的前序遍历(javascript)589. N-ary Tree Preorder Traversal

给定一个 n 叉树的根节点 root &#xff0c;返回 其节点值的 前序遍历 。 n 叉树 在输入中按层序遍历进行序列化表示&#xff0c;每组子节点由空值 null 分隔&#xff08;请参见示例&#xff09;。 Given the root of an n-ary tree, return the preorder traversal of its n…

python中while用法

python中while用法 例子&#xff1a; a1 while a<10:print(a)a2输出结果&#xff1a; 这段代码的意思是&#xff1a;a的初始值是1&#xff0c;判断条件是&#xff1a;如果a<10&#xff0c;则打印a&#xff0c;之后在返回的a的基础上加2&#xff0c;&#xff0c;如果a&…

while函数用法 matlab,Matlab(七)while循环的使用

Rate this post 在前一节课我们学习了if判断语句&#xff0c;在这篇博客&#xff0c;我们来学习循环语句&#xff1a;while 在此先打出一段简单的while循环代码&#xff1a; x1; while x<4 disp(x); x x1; end 在这段代码中&#xff0c;先声明x 1 当X < 4的时候&#x…

【JAVA】while的用法。

public class While { public static void main(String[] args) {//while 循环语句//不断重复完成某件工作&#xff0c;有明确的结束条件//for do whileint num0;//计数器while(num<10){ if(num%21){ num;continue;}//num为比6大的偶数时&#xff0c;循环结束if(num…

while在Java用法_while和do-while的使用方法

while循环开始后&#xff0c;先判别条件能否满足&#xff0c;假如满足就执行循环体内的语句&#xff0c;执行终了后再回来判别条件能否满足&#xff0c;如此无限反复&#xff1b;直到条件不满足时&#xff0c;执行while循环后边的语句。简单来讲就是说while循环是先判别后循环&…

y-在C语言while语句中的意义,c语言while用法(C语言while用法)

C语言while用法 需要稍作修改 #include main() { 5261int a,b,c,d; double e0.0; //这里e要初始化 a1,b1,c1; //b要从1开始&#xff0c;要不然第一个算4102不上 while(b<100) { ec*1.0/b;//要不然是整数1653除以整数&#xff0c;值是整数&#xff0c;也就是0 bb1; c-c; } pr…

php do while(),php do while用法详解

php do while是一种循环语句&#xff0c;该循环语句保证会执行一次&#xff0c;其使用语法如【<?php $i 0;do {echo $i;} while ($i > 0);?>】&#xff0c;其循环语句将正好运行一次。 推荐&#xff1a;《PHP视频教程》 do-while (PHP 4, PHP 5, PHP 7) do-while 循…

while在c语言中的作用,while的用法_C语言中while的用法

c语言中while的用法 当n==1时执行while循环结构里的语句,当n不等于1时,则跳过该循环执行循环体外的语句。 while 循环的格式:while (表达式){语句;} while 循环的执行顺序:当表达式为真,则执行下面的语句,语句执行完之后再判断表达式是否为真,如果为真,再次执行下面的…

PHP中用while的用法,php while语句的用法

在php中while语句指的是while循环语句&#xff0c;用于重复执行代码块&#xff0c;直到指定的条件不成立&#xff0c;其语法是【while (条件){要执行的代码;}】。 推荐&#xff1a;《PHP视频教程》 php while 循环 while 循环将重复执行代码块&#xff0c;直到指定的条件不成立…

三种循环语句的详解和使用(for,while,do-while)

对于刚接触编程的小可爱们&#xff0c;肯定会碰到这三种循环&#xff0c;书上写的有可能会过于专业化&#xff0c;会让我们感觉很难理解&#xff0c;在这里我就用最简洁明了的表达方式帮你理解并且学会使用这三种循环。 对于大佬们&#xff0c;读完你也许会新体会&#xff0c;新…

IO流(字符流)

IO流&#xff08;字符流&#xff09; 字符流 一.字符流是什么 字符流是可以直接读取字符的IO流字符流读取字符&#xff0c;就要先读去到字节数据&#xff0c;然后转为字符&#xff0c;如果要写出字符&#xff0c;需要把字符转为字节再写出 FileReader FileReader类的read(…

javaIO之字符流

目录 一、简介二、字符流入流1.1FileReader构造方法1.2FileReader读取字符数据 三、字符流出流3.1 FileWriter 构造方法3.2FileWriter写入数据3.3关闭close和刷新flush3.4FileWriter的续写和换行3.5文本文件复制 四、IO异常处理五、小结 一、简介 字符流 Reader 和 Writer 的故…