(Java)构造二叉树OJ题(LeetCode105 根据前序与中序构造二叉树,LeetCode106 根据后序与中序构造二叉树)

简介: 从前序遍历可以得到根结点,从中序中可以得到跟结点的左右子树部分,我们在构造二叉树的时候是从前序找根,再在中序中找根的左右子树部分先创建根节点再分别创建跟的左子树与跟的右子树,这个过程是一个递归,每次递归都要确定在中序哪个区间找新的根。

1. 根据前序与中序构造二叉树

根据前序与中序遍历构造二叉树


题目:给定一棵树的前序遍历 preorder 与中序遍历 inorder,请构造二叉树并返回其根节点 。


例如:

image.png


可以点开上述链接查看题目,具体做法如下:


分析:从前序遍历可以得到根结点,从中序中可以得到跟结点的左右子树部分,我们在构造二叉树的时候是从前序找根,再在中序中找根的左右子树部分先创建根节点再分别创建跟的左子树与跟的右子树,这个过程是一个递归,每次递归都要确定在中序哪个区间找新的根。


注意:前序顺序是根---左---右,所以还原的时候是根---左---右,这样才使得index++成立,index为标记前序的根,index从前序的开始依次走向末尾


具体步骤:


1. 在前序遍历中找根


2. 在中序遍历找根,用pos标记分界点,pos的左右两部分为递归找左与递归找右


3. 先还原根结点,再递归还原根的左子树,递归还原根的右子树


4. 递归还原的时候是依据中序遍历划分的范围


参考代码:

class Solution {
    int index = 0;  //标记前序的根
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        return reBuildTree(preorder,inorder,0,inorder.length);
    }
    public TreeNode reBuildTree(int[] preorder,int[] inorder,int left,int right){
        //递归返回条件
        if(index>=preorder.length || left>=right){
            return null;
        }
        int pos = left;
        //在中序中找根的位置
        while(pos < right){
            if(inorder[pos] == preorder[index]){
                break;
            }
            pos++;
        }
        TreeNode root = new TreeNode(preorder[index]);//还原根
        index++;
        root.left = reBuildTree(preorder,inorder,left,pos);//递归还原左
        root.right = reBuildTree(preorder,inorder,pos+1,right);//递归还原右
        return root;
    }
}


2. 根据后序与中序构造二叉树

根据后序与中序构造二叉树


题目:根据一棵树的中序遍历与后序遍历构造二叉树。


例如:

image.png



可以点开上述链接查看题目,具体做法如下:


分析:后序遍历可以确定根结点,中序遍历可以得到根结点的左右子树两部分,所以还在中序遍历中找根节点的位置,用pos标记,将中序遍历分为两个部分,再分别在这两个部分中递归构造根的左子树与根的右子树。


注意:后续遍历是左---右---根,所以我们在还原的时候倒着还原,还原顺序为:根---右---左,这样使得index--成立,index为标记后续的根,它从后续的末尾依次走向开始


具体步骤:


1. 从后续遍历中找到根


2. 在中序中找到根的位置,用pos标记将中序遍历分为两部分


3. 在pos标记的右部分递归还原根的右子树


4. 在pos标记的左部分递归还原根的左子树


参考代码:

class Solution {
    int index;  //标记后序遍历的根
    public TreeNode buildTree(int[] inorder, int[] postorder) {
        index = postorder.length-1; //后续的根
        return reBuildTree(inorder,postorder,0,inorder.length);
    }
    public TreeNode reBuildTree(int[] inorder,int[] postorder,int left,int right){
        //递归返回条件
        if(index < 0 || left >= right){
            return null;
        }
        //在中序遍历中找到根的位置
        int pos = left;
        while(pos < right){
            if(postorder[index] == inorder[pos]){
                break;
            }
            pos++;
        }
        //还原根
        TreeNode root = new TreeNode(postorder[index]);
        index--;
        root.right = reBuildTree(inorder,postorder,pos+1,right); //还原根的右
        root.left = reBuildTree(inorder,postorder,left,pos);  //还原根的左
        return root;
    }
}




相关文章
|
17天前
|
存储 算法 Java
Java中,树与图的算法涉及二叉树的前序、中序、后序遍历以及DFS和BFS搜索。
【6月更文挑战第21天】Java中,树与图的算法涉及二叉树的前序、中序、后序遍历以及DFS和BFS搜索。二叉树遍历通过访问根、左、右子节点实现。DFS采用递归遍历图的节点,而BFS利用队列按层次访问。以下是简化的代码片段:[Java代码略]
19 4
|
3天前
|
算法
刷算法Leetcode---9(二叉树篇Ⅲ)
刷算法Leetcode---9(二叉树篇Ⅲ)
9 3
|
16天前
|
Java
Java二叉树的遍历
Java二叉树的遍历
|
19天前
|
算法 搜索推荐 Java
二叉树的基本概念、常见操作以及如何使用Java代码
二叉树的基本概念、常见操作以及如何使用Java代码
14 1
|
13天前
|
Java
二叉树简单遍历、查找、删除(java)
二叉树简单遍历、查找、删除(java)
11 0
|
13天前
|
存储 Java
顺序存储二叉树(java)
顺序存储二叉树(java)
8 0
|
13天前
|
Java
二叉树线索化(java)
二叉树线索化(java)
9 0
|
13天前
|
Java 编译器
Java中4种代码块:普通代码块,静态代码块,同步代码块,构造代码块
Java中4种代码块:普通代码块,静态代码块,同步代码块,构造代码块
10 0
|
1天前
|
Java 开发者 UED
Java中的并发编程:解锁多线程的力量
【7月更文挑战第7天】在Java的世界中,掌握并发编程是提升应用性能和响应能力的关键。本文将深入探讨如何在Java中高效地使用多线程,包括创建和管理线程、同步机制、以及避免常见的并发陷阱。我们将一起探索锁、线程池、并发集合等工具,并了解如何通过这些工具来优化程序的性能和稳定性。
|
3天前
|
监控 安全 Java
Java中的线程调度与性能优化技巧
Java中的线程调度与性能优化技巧