根据前序、中序遍历重构二叉树

 1 public class ReconstructBinaryTree {
 2     public static void main(String[] args) {
 3         new ReconstructBinaryTree().reConstructBinaryTree(new int[] { 1, 2, 4,
 4                 7, 3, 5, 6, 8 }, new int[] { 4, 7, 2, 1, 5, 3, 8, 6 });
 5     }
 6
 7     public TreeNode reConstructBinaryTree(int[] pre, int[] in) {
 8         return reConstructBinaryTree(pre, 0, pre.length - 1, in, 0,
 9                 in.length - 1);
10     }
11
12     public TreeNode reConstructBinaryTree(int[] pre, int startPre, int endPre,
13             int[] in, int startIn, int endIn) {
14
15         if (startPre > endPre || startIn > endIn)
16             return null;
17
18         TreeNode root = new TreeNode(pre[startPre]);// 构造树根
19         for (int i = startIn; i <= endIn; i++) {
20             // 中序遍历中找树根
21             if (in[i] == pre[startPre]) {
22
23                 root.left = reConstructBinaryTree(pre, startPre + 1, i
24                         - startIn + startPre, in, startIn, i - 1);
25                 root.right = reConstructBinaryTree(pre, i - startIn + startPre
26                         + 1, endPre, in, i + 1, endIn);
27                 break;
28             }
29         }
30
31         return root;
32     }
33 }
34
35 class TreeNode {
36     int val;
37     TreeNode left;
38     TreeNode right;
39
40     TreeNode(int x) {
41         val = x;
42     }
43 }

前序遍历:12473568

中序遍历:47215386

重构过程:1. 前序遍历中的第一个值为树根

2. 树根在中序遍历中的位置,左侧为左子树的中序遍历结果(472),右侧为右子树的中序遍历结果(5386)

3. 在前序遍历中,左子树的前序遍历结果为(247),右子树的前序遍历结果为(3568)

4. 则2为左子树的树根,3为右子树的树根,重复上述操作

时间: 2024-11-03 20:47:22

根据前序、中序遍历重构二叉树的相关文章

前序遍历和中序遍历重建二叉树

对于二叉树,在此我不做过多讲解,如有不懂,请参照一下链接点击打开链接 1.在此二叉树的定义: struct BinaryTreeNode     {         BinaryTreeNode<T> *_Left;         BinaryTreeNode<T> *_Right;         T _data;     public:         BinaryTreeNode(const T& x)             :_Left(NULL)       

leetcode题解:Construct Binary Tree from Preorder and Inorder Traversal (根据前序和中序遍历构造二叉树)

题目: Given preorder and inorder traversal of a tree, construct the binary tree. Note:You may assume that duplicates do not exist in the tree. 说明: 1)二叉树可空 2)思路:a.根据前序遍历的特点, 知前序序列(PreSequence)的首个元素(PreSequence[0])为二叉树的根(root),  然后在中序序列(InSequence)中查找此根(

利用前序遍历和中序遍历构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3 / 9 20 / 15 7 思想:利用分治的思想来解决该题 具体解题步骤: 1.根据先序遍历,我们可以知道根节点就是给定数组的第一个元素pre[0],那么我们就可以在中序遍历中找出值等于pre[0]的位置,该位置的前半部分就是左子树,右半部分就是右子树, 2.重

根据先序遍历中序遍历重建二叉树

根据先序遍历和中序遍历的特点,我们想到了采用递归的方法来实现. 思路:1) 代码的容错性检查,比如:先序遍历和中序遍历长度应相等 2) 先保存先序遍历的第一个点,这个点为结点,接下来循环中序遍历,直到midOrd[index]=该结点,那么接下来就可以采用递归,分别对结点左边和右边的序列采用相同的方法. 3) 直到中序遍历中的序列中只含一个点,整个过程结束. 下面是我写的代码,一直显示错误,不知道什么原因. // 先序中序重建二叉树.cpp : Defines the entry point f

【数据结构】中序遍历线索二叉树

昨天写了个二叉树遍历,自以为对二叉树很了解了.自大的认为线索二叉树不过是加了点线索而已,不足挂齿.可是当真的自己编程序写的时候才发现完全不是那么容易.在有线索的情况下,如何判别Link类型的下一节点,如何不用栈跳过已访问节点搞得脑子晕晕的. 折腾一个晚上,才根据书上把线索二叉树的建立.中序遍历给写出来.要回去继续好好的理清关系. #include <stdio.h> #include <stdlib.h> typedef enum PointerTag{Link, Thread};

根据先序遍历和中序遍历建立二叉树

title: 根据先序遍历和中序遍历建立二叉树 date: 2019-07-23 22:37:34 tags: 数据结构 问题 已知一棵二叉树的先序遍历以及中序遍历,重建二叉树.二叉树的每一个节点有三个属性,左子节点,右子节点,以及节点值. 思路 先序遍历服从规则“根左右”,所以由此可知,对于一个先序遍历得到的数组,第一个元素一定是根节点: 中序遍历服从规则”左根右“,所以由此可知,对于一个中序遍历得到的数组,根节点左边的元素都属于根节点的左子树,而根节点右边的元素都属于根节点的右子树: 所以,

【Tree】已知前序和中序遍历还原二叉树

1 /************************** 2 https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/ 3 @date 2015.5.16 4 @description 5 根据前序和中序遍历,重构二叉树 6 可用迭代,也可以使用递归. 7 递归前面已经写过,耗时,这里再次做使用迭代. 8 9 @tags tree, array, depth-first se

根据二叉树的前序遍历和中序遍历重建二叉树

题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. 1 /** 2 * Definition for binary tree 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(

数据结构 二叉树 已知前序中序遍历求后续遍历的递归实现

代码很短,实现起来也很简单,下面是代码: // // main.cpp // PreMidgetPost // // Created by xin wang on 4/29/15. // Copyright (c) 2015 xin wang. All rights reserved. // #include <iostream> //链表二叉树的节点类 template <class T> class BinaryTreeNode{ public: BinaryTreeNode(