从前序与中序遍历序列构造二叉树

70 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第28天,点击查看活动详情

从前序与中序遍历序列构造二叉树

给定两个整数数组 preorderinorder ,其中 preorder 是二叉树的先序遍历inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。

编辑

编辑

思路

先序遍历的顺序是根节点,左子树,右子树。中序遍历的顺序是左子树,根节点,右子树。

所以我们只需要根据先序遍历得到根节点,然后在中序遍历中找到根节点的位置,它的左边就是左子树的节点,右边就是右子树的节点。

生成左子树和右子树就可以递归的进行了。

代码

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public int preIndex = 0;
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        return buildTreeChild(preorder,inorder,0,inorder.length-1);
    }
    private TreeNode buildTreeChild(int[] preorder,int[] inorder,int inbegin,int inend){
        //当前根节点是否有左右子树
        if(inbegin>inend){
            return null;
        }
        //根节点
        TreeNode root = new TreeNode(preorder[preIndex]);
        //root下标
       int rootIndex = findIndex(inorder,inbegin,inend,preorder[preIndex]);
       preIndex++;
        //左树
        if(rootIndex == -1){
            return null;
        }
        //建左右子树
        root.left = buildTreeChild(preorder,inorder,inbegin,rootIndex-1);
        root.right = buildTreeChild(preorder,inorder,rootIndex+1,inend);
        return root;
    }
    //找到根节点在中序遍历中的下标
     private int findIndex(int[] inorder,int inbegin,int inend,int val){
            for(int i = inbegin;i<=inend;i++)
            {
                if(inorder[i]==val){
                    return i;
                }
            }
            return -1;
        }
}