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

简介: 二叉树相关练习

假设是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=======================

目录
相关文章
|
3月前
|
存储 算法 前端开发
589. N 叉树的前序遍历
589. N 叉树的前序遍历
12 0
|
6月前
|
存储 算法 C++
【二叉树】利用前序和中序遍历结果生成二叉树并输出其后序和层序遍历结果
【二叉树】利用前序和中序遍历结果生成二叉树并输出其后序和层序遍历结果
58 0
二叉树的前序、中序和后序遍历
二叉树的前序、中序和后序遍历
|
JavaScript 前端开发 Java
二叉树的先序、中序、后序遍历
二叉树的先序、中序、后序遍历
106 0
二叉树的先序、中序、后序遍历
先序、中序、后序遍历确定唯一树
快速学习先序、中序、后序遍历确定唯一树
先序、中序、后序遍历确定唯一树
【C++】二叉树的遍历:前序、中序、后序、层序
【C++】二叉树的遍历:前序、中序、后序、层序
【C++】二叉树的遍历:前序、中序、后序、层序
15分钟精通二叉树,二叉树的先序,中序,后序,层次遍历顺序
🍀🍀🍀理解,掌握二叉树先序,中序,后序,层次四种遍历顺序
129 0
15分钟精通二叉树,二叉树的先序,中序,后序,层次遍历顺序
【小白学算法】8.二叉树的遍历,前序、中序和后序
【小白学算法】8.二叉树的遍历,前序、中序和后序
【小白学算法】8.二叉树的遍历,前序、中序和后序
590_N叉树的后序遍历
590_N叉树的后序遍历
65 0
589_N叉树的前序遍历
589_N叉树的前序遍历
72 0