复原二叉树

1.由(preorder+inorder)复原

/*
 * preorder:先序遍历数组
 * ps,pe:先序数组的首元素和末元素的索引
 * inod:中序遍历数组
 * is,ie:中序数组的首元素和末元素的索引
 */
public class Solution {
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        return buildBT(preorder,0,preorder.length-1,inorder,0,inorder.length-1);
    }

    private TreeNode buildBT(int[] preorder,int ps,int pe,int[] inorder,int is,int ie) {
        if(pe<ps)
            return null;
        TreeNode root=new TreeNode(preorder[ps]);
        if(pe==ps)
            return root;
        int middle=0;
        for(int i=is;i<=ie;i++)
            if(inorder[i]==preorder[ps]) {
                middle=i;
                break;
            }
        int len=middle-is;
        root.left=buildBT(preorder,ps+1,ps+len,inorder,is,middle-1);
        root.right=buildBT(preorder,ps+len+1,pe,inorder,middle+1,ie);
        return root;
    }
}

2.由(inorder+postorder)复原

/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public TreeNode buildTree(int[] inorder, int[] postorder) {
        return buildBT(inorder, 0, inorder.length-1, postorder, 0, postorder.length-1);
    }

    private TreeNode buildBT(int[] inorder,int is,int ie,int[] postorder,int ps,int pe) {
        if(is>ie)
            return null;
        TreeNode root=new TreeNode(postorder[pe]);
        if(pe==ps)
            return root;
        int middle=0;
        for(int i=is;i<=ie;i++)
            if(inorder[i]==postorder[pe]) {
                middle=i;
                break;
            }
        int len=middle-is;
        root.left=buildBT(inorder,is,middle-1,postorder,ps,ps+len-1);
        root.right=buildBT(inorder,middle+1,ie,postorder,ps+len,pe-1);
        return root;
    }
}

原文地址:https://www.cnblogs.com/midiyu/p/8547923.html

时间: 2024-10-23 03:25:31

复原二叉树的相关文章

poj2255 (二叉树遍历)

poj2255 二叉树遍历 Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Description Little Valentine liked playing with binary trees very much. Her favorite game was constructing randomly looking binary trees with capital letters in the

二叉树复原

描述 根据已经知的二叉树的前序序列以及中序序列,复原出相应的二叉树. 思路 根据二树的前序序列以及中序序列特点进行还原.前序序列首节点必为树的根节点,因此,在中序序列中查找定位到对应的根节点的位置.则位于中序序列中根节点所在位置的左侧节点全为树根节点的左子树上的节点:位于中序序列中根节点所在位置的右侧节点全为树根节点的右子树上的节点.然后可递归处理左.右子树即可还原. 注意: 01.根据该思路,还可以验证所输入的前序序列以及中序序列是否是合法的.只有合法的,才可以正确还原出对应的二叉树来.否则不

二叉树的递归插入【Java实现】

C++中由于有指针的存在,可以让二叉树节点指针的指针作为插入函数的实参,在函数体内通过*操作实现对真实节点指针.节点左孩子指针.节点右孩子指针的改变,这样很容易使用递归将大树问题转化到小树问题.但在JAVA中,由于没有指针只有引用,如果需要递归实现二叉树的元素插入,需要对节点进行包装,同时由于递归时需要将大树问题递归到子树,包装类中的节点需要改变,但因为最后需要的是根节点,所以根节点需要备份,在递归完成后复原.下面是实现代码: 1 package test; 2 3 4 5 public cla

[LeetCode] Recover Binary Search Tree 复原二叉搜索树

Two elements of a binary search tree (BST) are swapped by mistake. Recover the tree without changing its structure. Note:A solution using O(n) space is pretty straight forward. Could you devise a constant space solution? confused what "{1,#,2,3}"

红黑树一:从二叉树、2-3树到红黑树,一步步讲解红黑树的来源

目录 1 引言 2 从二叉查找树到红黑树的演变 2.1 二叉查找树 2.2 平衡二叉查找树 2.3 2-3树 2.4 红黑树 1 引言 RB-Tree,即红黑树,它的定义如下: 这是一颗二叉树,且每个节点要么是红色.要么是黑色 根节点是黑色 叶子节点也是黑色的,且叶子节点不存储数据,即叶子节点是nil空节点 不能出现连续的红色节点,即相邻的红色节点必须被黑色节点隔开 任何一个节点到达其任意一个叶子节点均包含相同数目的黑色节点 单看上面的定义,大家肯定跟我一样一头雾水,别急,下面我们从最简单的二叉

C#实现二叉树的遍历

C#实现二叉树的前序.中序.后序遍历. public class BinaryTreeNode     {         int value;         BinaryTreeNode left;         BinaryTreeNode right;         /// <summary>         /// 前序遍历         /// </summary>         /// <param name="tree">&l

【树4】二叉树的遍历

简介 遍历二叉树就是按照某种顺序,将树中的结点都枚举一遍,且每个结点仅仅访问一次.因为树不是线性的结构,遍历不像线性表那样简单,因此他的遍历需要特点的算法来完成. 从某种角度讲,对二叉树的遍历就是将树形结构转换为线性结构的操作. 二叉树的遍历方法主要有如下几种: 先序遍历:先访问root结点,再先序遍历左子树,再先序遍历右子树. 中序遍历:先中序遍历左子树,再访问root结点,再中序遍历右子树. 后序遍历:先后序遍历左子树,再后序遍历右子树,再访问root结点. 层遍历:从上到下,从左到右,一层

按之字形顺序打印二叉树

题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推 /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } }; */ class Solution { public: vector<vect

【数据算法】Java实现二叉树存储以及遍历

二叉树在java中我们使用数组的形式保存原数据,这个数组作为二叉树的数据来源,后续对数组中的数据进行节点化操作. 步骤就是原数据:数组 节点化数据:定义 Node节点对象 存储节点对象:通过LinkedList保存Node节点对象 在操作过程中我们需要将当前结点和前一节点.后一节点进行关系绑定 package tree; import java.util.LinkedList; import java.util.List; /** * 功能:把一个数组的值存入二叉树中,然后进行3种方式的遍历 *