目录
二叉树由于其结构的递归特性(即一棵树的左右子树仍然可以看作一棵树),使得其许多操作可以通过递归算法实现,下面给出三道java二叉树的经典进阶OJ题及题解供读者参考。
(注:本博客为博主主页博客“Java二叉树经典OJ题及题解”的续篇,具体内容见主页)
【Java二叉树经典进阶OJ题解 - CSDN App】http://t.csdnimg.cn/M2xTr
一、通过二叉树的前序遍历结果与中序遍历结果构建二叉树
1.题目描述:
2.代码示例:
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 {
//在类内定义成员变量:前序遍历结果数组下标。这样的话递归程序内前序遍历数组下标才能正确移动
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 inIndexBegin,int inIndexEnd){
//根据前序遍历结果,依次创建根节点,左子树,右子树
if(inIndexBegin>inIndexEnd){
//中序遍历结果中不存在根节点,直接返回
return null;
}
//先创建根节点
TreeNode root=new TreeNode(preorder[preIndex]);
//调用在中序遍历结果数组中寻找对应前序遍历结果数组中出现的根节点的下标的方法
int rootIndex=findRootIndex(preorder[preIndex],inorder, inIndexBegin,inIndexEnd);
preIndex++;
//通过根节点左侧遍历结果递归创建左子树
root.left=buildTreeChild(preorder,inorder,inIndexBegin,rootIndex-1);
//通过根节点右侧遍历结果递归创建右子树
root.right=buildTreeChild(preorder,inorder,rootIndex+1,inIndexEnd);
return root;
}
//在中序遍历结果数组中寻找对应前序遍历结果数组中出现的根节点的下标的底层方法
private int findRootIndex(int key,int[]inorder,int inIndexBegin,int inIndexEnd){
for(int i=inIndexBegin;i<=inIndexEnd;i++){
if(inorder[i]==key){
return i;
}
}
return -1;
}
}
3.通过演示及分析:
假设二叉树的节点个数为n,则该算法的时间复杂度为O(n^2)。
二、通过二叉树的中序遍历结果与后序遍历结果构建二叉树
1.题目描述:
2.代码示例:
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 {
//在类内定义成员变量:后序遍历结果数组下标。这样的话递归程序内后序遍历数组下标才能正确移动
int postIndex=0;
public TreeNode buildTree(int[] inorder, int[] postorder) {
//后序遍历结果数组下标从数组末尾开始
postIndex=postorder.length-1;
//调用通过中后序遍历结果构建二叉树的方法
return buildTreeChild(inorder,postorder,0,inorder.length-1);
}
//通过前中序遍历结果构建二叉树的底层方法
//参数分别为:前序遍历结果数组引用,中序遍历结果数组引用,中序遍历结果数组开始下标以及结束下标
private TreeNode buildTreeChild(int[] inorder,int[] postorder,int inIndexBegin,int inIndexEnd){
if(inIndexBegin>inIndexEnd){
//中序遍历结果中不存在根节点,直接返回
return null;
}
//根据后序遍历结果数组的倒序,依次创建根节点、右子树、左子树
//先创建根节点
TreeNode root=new TreeNode(postorder[postIndex]);
//调用在中序遍历结果数组中寻找对应后序序遍历结果数组中出现的根节点的下标的方法
int rootIndex=findRootIndex(postorder[postIndex],inorder, inIndexBegin,inIndexEnd);
postIndex--;
//通过根节点左侧遍历结果递归创建左子树
root.left=buildTreeChild(inorder,postorder,inIndexBegin,rootIndex-1);
//通过根节点右侧遍历结果递归创建右子树
root.right=buildTreeChild(inorder,postorder,rootIndex+1,inIndexEnd);
return root;
}
//在中序遍历结果数组中寻找对应前序遍历结果数组中出现的根节点的下标的底层方法
private int findRootIndex(int key,int[]inorder,int inIndexBegin,int inIndexEnd){
for(int i=inIndexBegin;i<=inIndexEnd;i++){
if(inorder[i]==key){
return i;
}
}
return -1;
}
}
3.通过演示及分析:
假设二叉树的节点个数为n,则该算法的时间复杂度为O(n^2)。
三、根据二叉树创建字符串
1.题目描述:
2.代码示例:
class Solution {
public String tree2str(TreeNode root) {
//创建StringBuilder类对象,利用其append与toString方法实现字符串拼接与转换
StringBuilder stringBuilder=new StringBuilder();
//调用转换为字符串的方法
tree2strChild(root,stringBuilder);
return stringBuilder.toString();
}
//转换为字符串的底层方法
private void tree2strChild(TreeNode root,StringBuilder stringBuilder){
if(root==null){
return;
}
stringBuilder.append(root.val);
//左右子树均为空
if(root.left==null&&root.right==null){
return;
}
//左子树不为空,右子树为空
if(root.left!=null&&root.right==null){
//处理左子树
stringBuilder.append("(");
tree2strChild(root.left,stringBuilder);
stringBuilder.append(")");
//右子树为空不需要转化
}
//左子树为空,右子树不为空
if(root.left==null&&root.right!=null){
//左子树为空直接转化
stringBuilder.append("()");
//处理右子树
stringBuilder.append("(");
tree2strChild(root.right,stringBuilder);
stringBuilder.append(")");
}
//左右子树均不为空
if(root.left!=null&&root.right!=null){
//处理左子树
stringBuilder.append("(");
tree2strChild(root.left,stringBuilder);
stringBuilder.append(")");
//处理右子树
stringBuilder.append("(");
tree2strChild(root.right,stringBuilder);
stringBuilder.append(")");
}
}
}
3.通过演示及分析:
假设二叉树的节点个数为n,则该算法的时间复杂度为O(n)。
以上便是Java二叉树经典进阶OJ题及题解的全部内容,如有不当,敬请斧正!