hdu1710 Binary Tree Traversals ----- 二叉树前序中序推后序

2023-10-14 18:59

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

原题链接: http://acm.hdu.edu.cn/showproblem.php?pid=1710


一:原题内容

Problem Description
A binary tree is a finite set of vertices that is either empty or consists of a root r and two disjoint binary trees called the left and right subtrees. There are three most important ways in which the vertices of a binary tree can be systematically traversed or ordered. They are preorder, inorder and postorder. Let T be a binary tree with root r and subtrees T1,T2.

In a preorder traversal of the vertices of T, we visit the root r followed by visiting the vertices of T1 in preorder, then the vertices of T2 in preorder.

In an inorder traversal of the vertices of T, we visit the vertices of T1 in inorder, then the root r, followed by the vertices of T2 in inorder.

In a postorder traversal of the vertices of T, we visit the vertices of T1 in postorder, then the vertices of T2 in postorder and finally we visit r.

Now you are given the preorder sequence and inorder sequence of a certain binary tree. Try to find out its postorder sequence.

Input
The input contains several test cases. The first line of each test case contains a single integer n (1<=n<=1000), the number of vertices of the binary tree. Followed by two lines, respectively indicating the preorder sequence and inorder sequence. You can assume they are always correspond to a exclusive binary tree.

Output
For each test case print a single line specifying the corresponding postorder sequence.
Sample Input
  
9 1 2 4 7 3 5 8 9 6 4 7 2 1 8 5 9 3 6
Sample Output
  
7 4 2 8 9 5 6 3 1


二:分析理解

题意:根据前序和中序写出后序  前序:1 2 4 7 3 5 8 9 6 中序:4 7 2 1 8 5 9 3 6 求出后序:7 4 2 8 9 5 6 3 1
首先得知道是如何前序遍历、中序遍历、后序遍历的,自己上网查下,我在这里就不多说了
思路:第一步:根据前序可知根节点为1;第二步:根据中序可知4 7 2为根节点1的左子树和8 5 9 3 6为根节点1的右子树;第三步:递归实现,把4 7 2当做新的一棵树和8 5 9 3 6也当做新的一棵树;第四步:在递归的过程中输出后序。


三:AC代码

#define _CRT_SECURE_NO_DEPRECATE 
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1 #include<iostream>
#include<algorithm>using namespace std;int t1[1005];
int t2[1005];void Func(int a, int b, int n, int flag)
{if (n == 1){printf("%d ", t1[a]);return;}else if (n == 0)return;int i = 0;for (; t1[a] != t2[b + i]; i++);Func(a + 1, b, i, 0);Func(a + i + 1, b + i + 1, n - i - 1, 0);if (flag == 1)printf("%d", t1[a]);elseprintf("%d ", t1[a]);
}int main()
{int n;while (~scanf("%d", &n)){for (int i = 1; i <= n; i++)scanf("%d", &t1[i]);for (int i = 1; i <= n; i++)scanf("%d", &t2[i]);Func(1, 1, n, 1);printf("\n");}return 0;
}


#define _CRT_SECURE_NO_DEPRECATE 
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1 #include<iostream>    
#include<algorithm>    using namespace std;struct Node
{int data;Node* pLeft;Node* pRight;Node(int _data) :data(_data) { pLeft = pRight = nullptr; }
};Node* root;
int N;
int a[1005];
int b[1005];Node* create(int t1,int t2,int num)
{Node* p = nullptr;for (int i = 0; i <num; i++){if (a[t1] == b[t2+i]){p = new Node(a[t1]);p->pLeft = create(t1+1,t2,i);p->pRight = create(t1 + i + 1, t2 + i + 1, num - i - 1);return p;}}return p;
}void postOrder(Node* p)
{if (p == nullptr)return;else{postOrder(p->pLeft);postOrder(p->pRight);if (p == root)printf("%d\n", p->data);elseprintf("%d ", p->data);}
}int main()
{while (~scanf("%d", &N)){for (int i = 0; i < N; i++)scanf("%d", &a[i]);for (int i = 0; i < N; i++)scanf("%d", &b[i]);root = create(0, 0, N);postOrder(root);}return 0;
}


参考博客链接: http://www.cnblogs.com/jiangjing/archive/2013/01/14/2860163.html






这篇关于hdu1710 Binary Tree Traversals ----- 二叉树前序中序推后序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

uva 575 Skew Binary(位运算)

求第一个以(2^(k+1)-1)为进制的数。 数据不大,可以直接搞。 代码: #include <stdio.h>#include <string.h>const int maxn = 100 + 5;int main(){char num[maxn];while (scanf("%s", num) == 1){if (num[0] == '0')break;int len =

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

树(Tree)——《啊哈!算法》

树 什么是树?树是一种特殊的图,不包含回路的连通无向树。 正因为树有着“不包含回路”这个特点,所以树就被赋予了很多特性。 一棵树中的任意两个结点有且仅有唯一的一条路径连通。一棵树如果有n个结点,那么它一定恰好有n-1条边。在一棵树中加一条边将会构成一个回路。 一棵树有且只有一个根结点。 没有父结点的结点称为根结点(祖先)。没有子结点的结点称为叶结点。如果一个结点既不是根结点也不是叶

PHP实现二叉树遍历(非递归方式,栈模拟实现)

二叉树定义是这样的:一棵非空的二叉树由根结点及左、右子树这三个基本部分组成,根据节点的访问位置不同有三种遍历方式: ① NLR:前序遍历(PreorderTraversal亦称(先序遍历)) ——访问结点的操作发生在遍历其左右子树之前。 ② LNR:中序遍历(InorderTraversal) ——访问结点的操作发生在遍历其左右子树之中(间)。 ③ LRN:后序遍历(PostorderT

226 Invert Binary Tree

//226 Invert Binary Tree//算法思路:主要使用递归算法public class Solution {public TreeNode invertTree(TreeNode root) {//1 出口 空节点if (root==null)return null;//2 递归 调用自己TreeNode left = root.left;TreeNode right = ro

在二叉树中找到两个节点的最近公共祖先(基于Java)

如题  题解 public int lowestCommonAncestor(TreeNode root, int o1, int o2) {//记录遍历到的每个节点的父节点。Map<Integer, Integer> parent = new HashMap<>();Queue<TreeNode> queue = new LinkedList<>();parent.put(roo

数据结构--二叉树(C语言实现,超详细!!!)

文章目录 二叉树的概念代码实现二叉树的定义创建一棵树并初始化组装二叉树前序遍历中序遍历后序遍历计算树的结点个数求二叉树第K层的结点个数求二叉树高度查找X所在的结点查找指定节点在不在完整代码 二叉树的概念 二叉树(Binary Tree)是数据结构中一种非常重要的树形结构,它的特点是每个节点最多有两个子节点,通常称为左子节点和右子节点。这种结构使得二叉树在数据存储和查找等方面具

笔试强训,[NOIP2002普及组]过河卒牛客.游游的水果大礼包牛客.买卖股票的最好时机(二)二叉树非递归前序遍历

目录 [NOIP2002普及组]过河卒 牛客.游游的水果大礼包 牛客.买卖股票的最好时机(二) 二叉树非递归前序遍历 [NOIP2002普及组]过河卒 题里面给的提示很有用,那个马的关系,后面就注意,dp需要作为long的类型。 import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息publ

222.完全二叉树的节点个数

(写给未来遗忘的自己) 题目: 代码: class Solution {public:int countNodes(TreeNode* root) {queue<TreeNode*>node_que;if(root==nullptr) return 0;node_que.push(root);int result;while(!node_que.empty()){int layer_s

代码随想录 -- 二叉树 -- 平衡二叉树

110. 平衡二叉树 - 力扣(LeetCode) 思路:仍然是递归调用 1. 定义一个递归函数 count 用来计算二叉树的层数 2. isBalanced 函数:如果传入根节点为空返回真;如果根节点 | 左子树的层数 - 右子树的层数 | 大于1,返回假;最后返回根节点左子树、右子树是否是平衡二叉树。 class Solution(object):def count(self,root