二叉树 根据二叉树的前序数组和中序序遍历数组生成二叉树

题目:给定二叉树的前序遍历和中序遍历,生成二叉树。

Example:

前序遍历数组:preArr[]:{1,2,4,5,3,6,7}

中序遍历数组:inArr[]:{4,2,5,1,6,3,7}

生成的二叉树如下图:

解题思路:

由二叉树的前序变量性质可知:preArr[0] 是数组的根节点,有根据二叉树的中序遍历的性质可知,{4,2,5}是二叉树的左子树,{6,3,7}在右子树上,重复执行该操作就构造出了二叉树

public class Solution {
    public TreeNode reConstructBinaryTree(int[] pre, int[] in) {
        TreeNode root = new TreeNode(pre[0]);//前序的第一个数定为根
        int len = pre.length;
        //当只有一个数的时候
        if (len == 1) {
            root.left = null;
            root.right = null;
            return root;
        }
        //找到中序中的根位置
        int rootval = root.val;
        int i;
        for (i = 0; i < len; i++) {
            if (rootval == in[i])
                break;
        }
        //创建左子树
        if (i > 0) {
            int[] pr = new int[i];
            int[] ino = new int[i];

            for (int j = 0; j < i; j++) {
                pr[j] = pre[j + 1];
            }
            for (int j = 0; j < i; j++) {
                ino[j] = in[j];
            }
            root.left = reConstructBinaryTree(pr, ino);
        } else {
            root.left = null;
        }
        //创建右子树
        if (len - i - 1 > 0) {
            int[] pr = new int[len - i - 1];
            int[] ino = new int[len - i - 1];
            for (int j = i + 1; j < len; j++) {
                ino[j - i - 1] = in[j];
                pr[j - i - 1] = pre[j];
            }
            root.right = reConstructBinaryTree(pr, ino);
        } else {
            root.right = null;
        }
        return root;
    }

    public static void main(String[] args) {
        int[] preArr = {1, 2, 4, 5, 3, 6, 7};
        int[] inArr = {4, 2, 5, 1, 6, 3, 7};
        Solution s = new Solution();
        TreeNode root = s.reConstructBinaryTree(preArr, inArr);
        s.postOrder(root);
    }
时间: 2024-10-07 14:19:40

二叉树 根据二叉树的前序数组和中序序遍历数组生成二叉树的相关文章

将数组A中的内容和数组B中的内容进行交换

交换两个数组的内容: #include<stdio.h> int main()//将数组A中的内容和数组B中的内容进行交换 { int a[5] = {  1, 2, 3, 4, 5 }; int b[5] = {  2, 3, 4, 5, 6 }; int tmp; int i; printf("before:\n"); for (i = 0; i<sizeof(a) / sizeof(a[0]); i++) { printf("%d ", a[

键盘录入6个int类型的数据存入数组arr中,将arr数组中的内容反转...

有一道很有意思的数组操作相关编程题,闲来无事用JS解决了一下,问题描述如下: (1) 键盘录入6个int类型的数据存入数组arr中: (2) 将arr数组中的内容反转: (3) 将反转后的数组角标为奇数的元素相互交换,即1和3交换,3和5交换,以此类推: (4) 将数组中最后一个角标为奇数的元素和数组中第一个角标为奇数的元素交换: (5)打印最终的数组,(实现了1—4步之后的数组) 示例:如用户输入的6个整数为[1,2,3,4,5,6]>[6,5,4,3,2,1]>[6,3,4,1,2,5]&

LeetCode 105. 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. 题目标签:Array, Tree 题目给了我们preOrder 和 inOrder 两个遍历array,让我们建立二叉树.先来举一个例子,让我们看一下preOrder 和 inOrder的特性. 1 / \ 2        

LeetCode 106. Construct Binary Tree from Inorder and Postorder Traversal (用中序和后序树遍历来建立二叉树)

Given inorder and postorder traversal of a tree, construct the binary tree. Note:You may assume that duplicates do not exist in the tree. 题目标签:Array, Tree 这到题目和105 几乎是一摸一样的,唯一的区别就是把pre-order 换成 post-order.因为post-order是最后一个数字是root,所以要从右向左的遍历.还需要把helpe

将数组A中的内容和数组B中的内容进行交换。(数组一样大)

题目比较简单,首先给定两个数组,进行直接交换. int main() { int arr1[5] = { 1, 2, 3, 4, 5 }; int arr2[5] = { 5, 4, 3, 2, 1 }; int len = sizeof(arr1) / sizeof(arr1[0]); for (int i = 0; i < len; i++) { int tmp = arr1[i]; arr1[i] = arr2[i]; arr2[i] = tmp; } for (int i = 0; i 

数组 --------集合 中的各种遍历方法!!!!!

(包名用了中文,大家不要在意这个) 1.数组     1.for 2.增强for package 杨彬_数组; public class ArrayDemo { /* * 数组遍历的方式: 1.for 2.增强for */ public static void main(String[] args) { int[] arr = { 1, 2, 3, 4, 5 }; test1(); test2(arr); } //增强for private static void test2(int[] arr

Swust OJ975: 统计利用先序遍历创建的二叉树的度为2的结点个数

题目简述 利用先序递归遍历算法创建二叉树并计算该二叉树度为2结点的个数 输入 接受键盘输入的由大写英文字符和"#"字符构成的一个字符串(用于创建对应的二叉树). 输出 输出该用例对应的二叉树度为2的结点个数. 样例输入复制 ABCD###EF##G##H## 样例输出复制 3知识点:二叉树每个结点至多只有两棵子树,即二叉树中不存在大于2的结点故所求二叉树度为2的结点,即既有左孩子也要有右孩子 void DegreeTwo(Tree *&tree) { if(tree!=NULL

JavaScript中遍历数组 最好不要使用 for in 遍历

先看一段代码 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Document</title> 6 </head> 7 <body> 8 9 <script> 10 // 一个普通的数组 11 var arr =[3,5,2,6]; 12 // 普通

JS中split用法和数组中元素的删除

JS中split用法 <script language="javascript"> function spli(){ datastr="2,2,3,5,6,6"; var str= new Array(); str=datastr.split(","); for (i=0;i<str.length ;i++ ) { document.write(str[i]+"<br/>"); } } spli(