递归重建二叉树的思路

(1)通过前序列表(根左右) 和 中序列表(左跟右)来重建二叉树

思路 前序遍历 序列中,第一个数字总是二叉树的根节点。在中序遍历 序列中,根节点的值在序列的中间,左子树的节点的值位于根节点的值的左边,右子树的节点的值位于根节点的值的右边。根据二叉树的这个性质,采用递归方法可以重建一个二叉树了。

/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
        TreeNode node=reConstructBinaryTree(pre,0,pre.length-1,in,0,in.length-1);
        return node;
    }
    public TreeNode reConstructBinaryTree(int [] pre,int ps,int pe,int [] in,int is,int ie) {
        if(ps>pe)//如果开始位置大于结束位置说明已经处理到叶节点了
            return null;
        int value=pre[ps];
        int index=is;
        while(index<=ie&&in[index]!=value)//找到的index为根节点在中序遍历序列中的索引
            index++;
        TreeNode node=new TreeNode(pre[startPre]);
        node.left=reConstructBinaryTree(pre,ps+1,ps+index-is,in,is,index-1);
        node.right=reConstructBinaryTree(pre,ps+index-is+1,pe,in,index+1,ie);
        return node;
    }
}

(2)用Java中的Arrays.copyOfRange完成二叉树的重建工作

Arrays.copyOfRange(T[ ] original,int from,int to) 将一个原始的数组original,从小标from开始复制,复制到小标to,生成一个新的数组。 注意这里包括下标from,不包括下标to。

public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
        if(pre.length == 0 || in.length == 0){
            return null;
        }
        TreeNode node = new TreeNode(pre[0]);//获取根节点
        for(int i = 0 ; i < in.length ; i++){
            if(pre[0] == in[i]){
                node.left = reConstructBinaryTree(Arrays.copyOfRange(pre, 1, i+1), Arrays.copyOfRange(in, 0, i));
                node.right = reConstructBinaryTree(Arrays.copyOfRange(pre, i+1, pre.length), Arrays.copyOfRange(in, i+1, in.length));
            }
        }
        return node;

    }

原文地址:https://www.cnblogs.com/tongxupeng/p/10257532.html

时间: 2024-10-09 12:22:16

递归重建二叉树的思路的相关文章

剑指Offer -- 重建二叉树(详细思路)

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

4、重建二叉树------------&gt;剑指offer系列

题目1-二叉树重建 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. 思路 前序遍历:跟节点 + 左子树前序遍历 + 右子树前序遍历 中序遍历:左子树中序遍历 + 跟节点 + 右字数中序遍历 后序遍历:左子树后序遍历 + 右子树后序遍历 + 跟节点 根据上面的规律: 前序遍历找到根结点root 找到root在

(难)【07】根据前序,中序遍历重建二叉树

题目 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. input : 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 思路 这道题我不会做,看了题解之后,才发现有迹可循.可以使用递归. 具体思路我会在代码中注释 收获 递归重建二叉树 代码: /** * Definition for a binary tree node. * public class TreeNo

二叉树(15)----由中序遍历和后序遍历重建二叉树,递归方式

1.二叉树定义 typedef struct BTreeNodeElement_t_ { void *data; } BTreeNodeElement_t; typedef struct BTreeNode_t_ { BTreeNodeElement_t *m_pElemt; struct BTreeNode_t_ *m_pLeft; struct BTreeNode_t_ *m_pRight; } BTreeNode_t; 2.由中序遍历和后序遍历重建二叉树 中序遍历中,根节点总是位于左右子树

牛客_剑指offer_重建二叉树,再后续遍历_递归思想_分两端

   总结:    重建二叉树:其实就是根据前序和中序重建得到二叉树,得到后续,只要输出那边设置输出顺序即可 [编程题]重建二叉树 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. 完整通过代码: 先新建一个二叉树的类 public class TreeNode { int val; TreeNode left

根据前序和中序重建二叉树

注意:1.仅根据前序和后序无法构建唯一的二叉树:2.二叉树前序遍历,第一个数字总是树的根节点的值:3.中序遍历中,根节点的值在序列的中间,左子树的值子在根节点的值的左边,右字树的值在根节点的值的右边:4.思路:递归 #include <iostream> #include <stdlib.h> using namespace std; struct Node{ int value; Node* left; Node* right; }; Node* ConstructCore(in

剑指offer 重建二叉树

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

[算法题] 重建二叉树

题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 题目思路 本题就是按照建立二叉树的思路建立就行了.先序遍历的第一个是根节点,然后在中序遍历找到该根节点,以此为界,中序遍历的左边是它的左子树的中序遍历,同样地找到该左子树在先序遍历中对应的先序遍历顺序.对于右子树也是一样的方法. 本体采用递归,递归就要先写出终止条件. Python代码 这个题目用Python非常方便,因为可以直接利用到Python中的切片技术,省时省力通俗

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

问题描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. 思路: 在二叉树的前序遍历序列中,第一个数字总是树的根结点的值.但在中序遍历序列中,根结点的值在序列的中间,左子树的结点的值位于根结点的值的左边,而右子树的结点的值位于根结点的值的右边.因此我们需要扫描中序遍历序列,才能找到根结点的值. 如下图所示,