【剑指 Offer 学习】【面试题 24: 二叉搜索树的后序遍历序列】【思路】

题目:

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。

 

思路:

  • 输入的数组不能为空,并且有数据。
  • 先找到右子树的开始位置,然后分别进行左右子树递归处理。

代码:

package 二叉搜索树的后序遍历序列24;

import java.util.*;

/**
 * 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。
 * 如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
 * @author Administrator
 *
 */
public class Demo {

	public static boolean VerifySquenceOfBST(int[] sequence) {
		// 输入的数组不能为空,并且有数据
		if (sequence == null && sequence.length <= 0) {
			return false;
		}
		
		// 后序遍历中,最后一个数字是树的根结点。root :根结点
		int rstart = 0;
		int length = sequence.length;			
		
		
		// 在二叉搜索树中左子树的结点小于根节点。计算左子树结点数量
		for (int i = 0; i < length - 1; i++) {
			if (sequence[i] < sequence[length - 1]) {
				rstart++;
			}
		}
		
		// 若 rstart 为 0,则不存在左子树。全部元素为右子树结点,重新判断
		if (rstart == 0) {
			VerifySquenceOfBST(Arrays.copyOfRange(sequence, 0, length - 1));
		} else {
			// 若 rstart 不为 0 ,遍历右子树,若有元素小于根节点,则不满足右子树所有结点大于根节点这一条件
			for (int i = rstart; i < length - 1; i++) {
				if (sequence[i] <= sequence[length - 1]) {
					return false;
				}
			}
			// 判断左子树是不是二叉搜索树
			VerifySquenceOfBST(Arrays.copyOfRange(sequence, 0, length - 1));
			// 判断右子树是不是二叉搜索树
			VerifySquenceOfBST(Arrays.copyOfRange(sequence, rstart, length - 1));
		}
		return true;
	}
	
	public static void main(String[] args) {
		//          10
		//         /   \
		//        6     14
		//       /\     /\
		//      4  8  12  16
		int[] data = { 4, 8, 6, 12, 16, 14, 10 };
		System.out.println("true: " + VerifySquenceOfBST(data));
		//           5
		//          / \
		//         4   7
		//            /
		//           6
		int[] data2 = { 4, 6, 7, 5 };
		System.out.println("true: " + VerifySquenceOfBST(data2));
	    //               5
	    //              /
		//             4
		//            /
		//           3
		//          /
		//         2
		//        /
		//       1
		int[] data3 = { 1, 2, 3, 4, 5 };
		System.out.println("true: " + VerifySquenceOfBST(data3));
		// 1
		//  \
		//   2
		//    \
		//     3
		//      \
		//       4
		//        \
		//         5
		int[] data4 = { 5, 4, 3, 2, 1 };
		System.out.println("true: " + VerifySquenceOfBST(data4));
		// 树中只有1个结点
		int[] data5 = { 5 };
		System.out.println("true: " + VerifySquenceOfBST(data5));
		int[] data6 = { 7, 4, 6, 5 };
		System.out.println("false: " + VerifySquenceOfBST(data6));
		int[] data7 = { 4, 6, 12, 8, 16, 14, 10 };
		System.out.println("false: " + VerifySquenceOfBST(data7));
	}
}

猜你喜欢

转载自blog.csdn.net/qq_36847713/article/details/86437939