树的遍历(已知前序遍历中序遍历求后序遍历,或者已知后序中序求先序)

简介: 二叉树相关练习

假设是1000个结点以内,

输入前序  4 1 3 2 6 5 7

      中序  1 2 3 4 5 6 7

得到后续  2 3 1 5 7 6 4





已知前序遍历中序遍历求后序遍历:


importjava.io.BufferedInputStream;
importjava.util.Scanner;
classNode {
intdata;
Nodeleft, right;
}
publicclassMain {
publicstaticint[] pre=newint[1001];
publicstaticint[] in=newint[1001];
publicstaticvoidmain(String[] args) {
Scannercin=newScanner(newBufferedInputStream(System.in));
intn=cin.nextInt();
for (inti=0; i<n; ++i) {
pre[i] =cin.nextInt();
        }
for (inti=0; i<n; ++i) {
in[i] =cin.nextInt();
        }
cin.close();
Nodehead=createTree(pre, 0, in, 0, n);
postTraverse(head);
    }
publicstaticvoidpostTraverse(Nodenode) {
if (node==null)
return;
postTraverse(node.left);
postTraverse(node.right);
System.out.print(node.data+" ");
    }
// 已知先序中序,建树// @param pre 先序遍历的数组// @param lo 先序遍历的起点下标// @param in 中序遍历的数组// @param ini 中序遍历的起点下标// @param n 这个树的结点个数publicstaticNodecreateTree(int[] pre, intlo, int[] in, intini, intn) {
if (n<=0) {
returnnull;
        }
Nodenode=newNode();
node.data=pre[lo];
inti;
for (i=0; i<n; ++i) {
if (pre[lo] ==in[ini+i]) // 寻找到该树的根节点就又可以划分左右子树查找了break;
        }
node.left=createTree(pre, lo+1, in, ini, i); // 左区间node.right=createTree(pre, lo+i+1, in, ini+i+1, n-i-1); // 右区间// 最后一个参数是这个子树的有多少结点returnnode;
    }
}

image.gif

题目描述


输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。


练习题地址:

重建二叉树_牛客题霸_牛客网


AC代码:

/*** Definition for binary tree* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode(int x) { val = x; }* }*/publicclassSolution {
publicTreeNodereConstructBinaryTree(int[] pre, int[] in) {
returnreConstructBinaryTree1(pre, 0, in, 0, in.length);
    }
privateTreeNodereConstructBinaryTree1(int[] pre, intlo, int[] in, intini, intn) {
if (n<=0)
returnnull;
TreeNodenode=newTreeNode(pre[lo]);
inti;
for (i=0; i<n; ++i) {
if (pre[lo] ==in[ini+i])
break;
        }
node.left=reConstructBinaryTree1(pre, lo+1, in, ini, i);
node.right=reConstructBinaryTree1(pre, lo+i+1, in, ini+i+1, n-i-1);
returnnode;
    }
}

image.gif

=====================Talk is cheap, show me the code=======================

目录
相关文章
|
2月前
|
存储
二叉树的先序遍历和后序遍历的区别
先序遍历和后序遍历在遍历顺序、应用场景、实现方式以及复杂度等方面都存在一定的区别,在实际应用中需要根据具体问题的需求来选择合适的遍历方式。
78 5
|
存储 算法 C++
【二叉树】利用前序和中序遍历结果生成二叉树并输出其后序和层序遍历结果
【二叉树】利用前序和中序遍历结果生成二叉树并输出其后序和层序遍历结果
169 0
|
JavaScript 前端开发 Java
二叉树的先序、中序、后序遍历
二叉树的先序、中序、后序遍历
179 0
二叉树的先序、中序、后序遍历
先序、中序、后序遍历确定唯一树
快速学习先序、中序、后序遍历确定唯一树
先序、中序、后序遍历确定唯一树
|
C++
【C++】二叉树的遍历:前序、中序、后序、层序
【C++】二叉树的遍历:前序、中序、后序、层序
227 0
|
开发工具
15分钟精通二叉树,二叉树的先序,中序,后序,层次遍历顺序
🍀🍀🍀理解,掌握二叉树先序,中序,后序,层次四种遍历顺序
188 0
15分钟精通二叉树,二叉树的先序,中序,后序,层次遍历顺序
【小白学算法】8.二叉树的遍历,前序、中序和后序
【小白学算法】8.二叉树的遍历,前序、中序和后序
【小白学算法】8.二叉树的遍历,前序、中序和后序
|
C语言 C++
前序遍历+中序遍历重建二叉树
前序遍历+中序遍历重建二叉树
160 0
前序遍历+中序遍历重建二叉树

热门文章

最新文章

下一篇
开通oss服务