概念普及
二叉树:每个节点都不能有多于两个的儿子
二叉检索树:对于树中的每个节点X,左子树中所有关键字的值小于X的值,右子树中所有关键字的值大于X的值
前序遍历:根节点——>左子树——>右子树
后序遍历:左子树——>右子树——>根节点
中序遍历:左子树——>根节点——>右子树
前序遍历的结果:20,15,10,12,18,25,30
后序遍历的结果:12,10,18,15,30,25,20
中序遍历的结果:12,10,15,18,20,30,25
思路
处理二叉检索树的遍历序列,先找到二叉树的根节点,再根据根节点把整棵树分为左子树和右子树,再递归的处理两个序列。
题目1
题目:输入一个整数数组,判断该数组是不是某二叉检索树的后序遍历的结果。如果是,则返回true,否则返回false,假设输入数组的任意两个数字都不相同
package com.cn;
import java.util.Scanner;
public class TwoForkTreeEnd {
public static void main(String[] args) {
//输入待判断数组
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int []a = new int[n];
for(int i = 0; i < n; i++ ){
a[i] = sc.nextInt();
}
boolean b = Judge(a,0,n-1);
System.out.println(b);
}
public static boolean Judge(int[] a,int start,int end){
if(a == null){
return false;
}
int root = a[end];
//在二叉检索树中搜索左子树的节点小于根节点
int i = start;
for(;i<end;i++){
if(a[i] > root){
break;
}
}
//在二叉检索树中搜索右子树的节点大于根节点
int j = i;
for(;j<end;j++){
if(a[j] < root){
return false;
}
}
//判断左子树是否为二叉检索树
boolean left = true;
if(i-1 > start){
left = Judge(a,start,i-1);
}
//判断右子树是否为二叉检索树
boolean right = true;
if(i < end -1){
right = Judge(a,i,end-1);
}
return left&&right;
}
}
题目2
题目:输入一个整数数组,判断该数组是不是某二叉检索树的前序遍历的结果。如果是,则返回true,否则返回false,假设输入数组的任意两个数字都不相同
package com.cn;
import java.util.Scanner;
public class TwoForkTreeBegin {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int []a = new int[n];
for(int i = 0; i < n; i++ ){
a[i] = sc.nextInt();
}
boolean b = Judge(a,0,n-1);
System.out.println(b);
}
public static boolean Judge(int []a,int start,int end){
if(a == null){
return false;
}
if(start >= end ){
return true;
}
int root = a[start];
//在二叉树中检索左子树的节点小于根节点
int i = start+1;
for(;i<=end;i++){
if(a[i] > root){
break;
}
}
//在二叉树中检索右子树的节点大于根节点
int j = i;
for(;j<=end;j++){
if(a[j] < root){
return false;
}
}
//判断左子树
boolean left = Judge(a,start+1,i-1);
//判断右子树
boolean right = Judge(a,i,end);;
return left && right;
}
}